home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1995 February: Tool Chest / Dev.CD Feb 95 / Dev.CD Feb 95.toast / Tool Chest / Development Tools & Languages / Dylan Related / MacMarlais 0.5.4 ƒ / init.dyl < prev    next >
Encoding:
Text File  |  1994-09-20  |  77.1 KB  |  2,624 lines  |  [TEXT/Mrls]

  1. module:        dylan
  2. authors:    Brent Benson
  3.             Joseph N. Wilson (jnw@cis.ufl.edu)
  4.             Patrick C. Beard (beard@cs.ucdavis.edu)
  5. copyright:    Copyright, 1993, Brent Benson.  All Rights Reserved.
  6.             0.4 & 0.5 Revisions Copyright 1994, Joseph N. Wilson.  All Rights Reserved.
  7.  
  8. //
  9. // init.dyl
  10. //
  11. //
  12. // Copyright, 1993, Brent Benson.  All Rights Reserved.
  13. // 0.4 & 0.5 Revisions Copyright 1994, Joseph N. Wilson.  All Rights Reserved.
  14. //
  15. // "Translated" to DIRM syntax by Patrick C. Beard (beard@cs.ucdavis.edu)
  16. //
  17. // Permission to use, copy, and modify this software and its
  18. // documentation is hereby granted only under the following terms and
  19. // conditions.  Both the above copyright notice and this permission
  20. // notice must appear in all copies of the software, derivative works
  21. // or modified version, and both notices must appear in supporting
  22. // documentation.  Users of this software agree to the terms and
  23. // conditions set forth in this notice.
  24. //
  25. // jnw@cis.ufl.edu
  26. // http://www.cis.ufl.edu/~jnw/
  27. //
  28. //
  29.  
  30. //(define-method make ((c <class>) #rest args #key #all-keys)
  31. //  (%make c args))
  32.  
  33. define method make (c :: <class>, #rest args, #key, #all-keys)
  34.     %make(c, args);
  35. end method;
  36.  
  37. // pcb:  what happens to all-keys in old version?
  38.  
  39. // (define instance? (method (obj (t <type>)) (%instance? obj t)))
  40.  
  41. define constant instance? =
  42.     method (obj, typ :: <type>)
  43.         %instance?(obj, typ);
  44.     end;
  45.  
  46. //(define-method as ((c <class>) (obj <object>))
  47. //  (if (object-class obj c)
  48. //      obj
  49. //      (error "No method to coerce ~a to ~a~%" obj c)))
  50.  
  51. define method as (c :: <class>, obj :: <object>)
  52.     if (object-class(obj, c))
  53.         obj;
  54.     else
  55.         error("No method to coerce ~a to ~a~%", obj, c);
  56.     end;
  57. end method;
  58.  
  59. //(define-method as ((kc (singleton <keyword>)) (s <symbol>)) (%symbol->keyword s))
  60. define method as (kc == <keyword>, s :: <symbol>)
  61.     %symbol->keyword(s);
  62. end method;
  63.  
  64. //(define-method as ((sc (singleton <symbol>)) (k <keyword>)) (%keyword->symbol k))
  65. define method as (sc == <symbol>, k :: <keyword>)
  66.     %keyword->symbol(k);
  67. end method;
  68.  
  69. //(define-method as ((sc (singleton <string>)) (s <symbol>)) (%symbol->string s))
  70. define method as (sc == <string>, s :: <symbol>)
  71.     %symbol->string(s);
  72. end method;
  73.  
  74. //(define-method as ((sc (singleton <symbol>)) (s <string>)) (%string->symbol s))
  75. define method as (sc == <symbol>, s :: <string>)
  76.     %string->symbol(s);
  77. end method;
  78.  
  79. // (define-method error ((msg <string>) #rest args) (%apply %error (%pair msg args)))
  80. define method error (msg :: <string>, #rest args)
  81.     %apply(%error, %pair(msg, args));
  82. end method;
  83.  
  84. //(define-method warning ((msg <string>) #rest args) (%apply %warning (%pair msg args)))
  85. define method warning (msg :: <string>, #rest args)
  86.     %apply(%warning, %pair(msg, args));
  87. end method;
  88.  
  89. //(define-method cerror (#rest args)
  90. //  (format #t "cerror: called with arguments ~A" args))
  91. define method cerror (#rest args)
  92.     format(#t, "cerror: called with arguments ~A", args);
  93. end method;
  94.  
  95. //(define-method signal (#rest args)
  96. //  (%signal-error-jump))
  97.  
  98. //(define-method initialize (instance #key #all-keys))
  99. define method initialize (instance, #key, #all-keys)
  100.     // warning("default initialize method here");
  101. end method;
  102.  
  103. //
  104. // streams
  105. //
  106.  
  107. //(define-method open-input-file ((s <string>)) (%open-input-file s))
  108. define method open-input-file (s :: <string>) %open-input-file(s); end method;
  109.  
  110. //(define-method open-output-file ((s <string>)) (%open-output-file s))
  111. define method open-output-file (s :: <string>) %open-output-file(s); end method;
  112.  
  113. //(define-method close-stream ((s <stream>)) (%close-stream s))
  114. define method close-stream (s :: <stream>) %close-stream(s); end method;
  115.  
  116. //(define-method eof-object? (obj) (%eof-object? obj))
  117. define method eof-object? (obj) %eof-object?(obj); end method;
  118.  
  119. //(define-method standard-input () (%standard-input))
  120. define method standard-input () %standard-input(); end method;
  121.  
  122. //(define-method standard-output () (%standard-output))
  123. define method standard-output () %standard-output(); end method;
  124.  
  125. //(define-method standard-error () (%standard-error))
  126. define method standard-error () %standard-error(); end method;
  127.  
  128. //(define-method print (obj) (%print obj))
  129. define method print (obj) %print(obj) end method;
  130.  
  131. //(define-method princ (obj) (%princ obj))
  132. define method princ (obj) %princ(obj) end method;
  133.  
  134. //(define-method format (stream (s <string>) #rest args) (%format stream s args))
  135. define method format (stream, s :: <string>, #rest args)
  136.     %format(stream, s, args);
  137. end method;
  138.  
  139. //(define-method write-char ((c <character>) #rest maybe-stream) 
  140. //  (%write-char c maybe-stream))
  141. define method write-char (c :: <character>, #rest maybe-stream)
  142.     %write-char(c, maybe-stream);
  143. end method;
  144.  
  145. //(define-method read (#rest stream)
  146. //  (if (empty? stream)
  147. //      (%read)
  148. //      (%read (head stream))))
  149. define method read (#rest stream)
  150.     if (empty?(stream))
  151.         %read();
  152.     else
  153.         %read(head(stream));
  154.     end if;
  155. end method;
  156.  
  157. //(define-method read-char (#rest stream)
  158. //  (if (empty? stream)
  159. //      (%read-char)
  160. //      (%read-char (head stream))))
  161. define method read-char (#rest stream)
  162.     if (empty?(stream))
  163.         %read-char();
  164.     else
  165.         %read-char(head(stream));
  166.     end if;
  167. end method;
  168.  
  169. //
  170. // functions
  171. //
  172. //(define-method generic-function-methods ((gf <generic-function>)) 
  173. //  (%generic-function-methods gf))
  174. define method generic-function-methods (gf :: <generic-function>)
  175.     %generic-function-methods(gf);
  176. end method;
  177.  
  178. //(define-method add-method ((gf <generic-function>) (method <method>))
  179. //  (%add-method gf method))
  180. define method add-method (gf :: <generic-function>, meth :: <method>)
  181.     %add-method(gf, meth);
  182. end method;
  183.  
  184. //(define-method generic-function-mandatory-keywords ((gf <generic-function>))
  185. //  (%generic-function-mandatory-keywords gf))
  186. define method generic-function-mandatory-keywords (gf :: <generic-function>)
  187.     %generic-function-mandatory-keywords(gf);
  188. end method;
  189.  
  190.  
  191. //(define-method function-specializers ((m <method>)) (%function-specializers m))
  192. define method function-specializers (meth :: <method>)
  193.     %function-specializers(gf, meth);
  194. end method;
  195.  
  196.  
  197. //(define-method method-specializers ((m <method>)) 
  198. //  (warning "method specializers is now function-specializers")
  199. //  (%function-specializers m))
  200.  
  201. //(define-method function-arguments ((f <function>)) (%function-arguments f))
  202. define method function-arguments (f :: <function>)
  203.     %function-arguments(f);
  204. end method;
  205.  
  206. //(define-method applicable-method? ((m <method>) #rest args) 
  207. //  (%apply %applicable-method? (%pair m args)))
  208. define method applicable-method? (m :: <method>, #rest args)
  209.     %apply(%applicable-method?, %pair(m, args));
  210. end method;
  211.  
  212. //(define-method sorted-applicable-methods ((gf <generic-function>) #rest args)
  213. //  (%apply %sorted-applicable-methods (%pair gf args)))
  214. define method sorted-applicable-methods (gf :: <generic-function>, #rest args)
  215.     %apply(%sorted-applicable-methods, %pair(gf, args));
  216. end method;
  217.  
  218.  
  219. //(define-method find-method ((gf <generic-function>) #rest sample-arguments)
  220. //  (%find-method gf sample-arguments))
  221. define method find-method (gf :: <generic-function>, #rest sample-args)
  222.     %find-method(gf, sample-args);
  223. end method;
  224.  
  225. //(define-method remove-method ((gf <generic-function>) (method <method>))
  226. //  (%remove-method gf method))
  227. define method remove-method (gf :: <generic-function>, meth :: <method>)
  228.     %remove-method(gf, meth);
  229. end method;
  230.  
  231. //(define-method make ((gftype (singleton <generic-function>))
  232. //             #key required rest key all-keys)
  233. //  ; if with no else below
  234. //  (and (instance? required <number>)
  235. //       (set! required (make <list>
  236. //                size: required
  237. //                fill: <object>)))
  238. //  (if (instance? required <list>)
  239. //      (%generic-function-make required rest key all-keys)
  240. //      (error "make: bad key value" required: required)))
  241.  
  242. define method make (gftype == <generic-function>, #key required, rest, key, all-keys)
  243.     // if with no else below
  244.     if (instance?(required, <number>))
  245.         required := make(<list>,  size: required, fill: <object>);
  246.     end if;
  247.     if (instance?(required, <list>))
  248.         %generic-function-make(required, rest, key, all-keys);
  249.     else
  250.         error("make: bad key value", required: required);
  251.     end if;
  252. end method;
  253.  
  254. //(define-method debug-name-setter ((m <method>) (s <symbol>)) (%debug-name-setter m s))
  255. define method debug-name-setter (m :: <method>, s :: <symbol>)
  256.     %debug-name-setter(m, s);
  257. end method;
  258.  
  259. //(define-method apply ((f <function>) #rest args)
  260. //  ; pretty kludgy -- hacked in late at night to make apply work for
  261. //  ; arbitrary <sequence> type as last arg. -- jnw
  262. //  (bind-methods ((collect-args (args)
  263. //          (cond
  264. //           ((empty? args) '())
  265. //           ((empty? (tail args)) 
  266. //            (if (not (instance? (head args) <sequence>))
  267. //            (error "apply: last arg must be a sequence" (head args))
  268. //            (head args)))
  269. //           (else:
  270. //            (bind ((res (list)))
  271. //              (for ((state (initial-state args)
  272. //                       (next-state args state)))
  273. //                   ((not state))
  274. //                   (set! res (pair (current-element args state)
  275. //                           res)))
  276. //              (bind ((argseq (head res)))
  277. //                   (set! res (tail res))
  278. //                   (for ((state (initial-state argseq)
  279. //                        (next-state argseq state)))
  280. //                    ((not state) res)
  281. //                    (set! res
  282. //                      (pair (current-element argseq state)
  283. //                        res))))
  284. //              (reverse! res))))))
  285. //        (%apply f (collect-args args))))
  286.  
  287. define method apply (f :: <function>, #rest args)
  288.     // flatten all args into a single list.
  289.     local method collect-args (args)
  290.         case
  291.         empty?(args) => #();
  292.         empty?(tail(args)) =>
  293.             if (~instance?(head(args), <sequence>))
  294.                 error("apply:  last arg must be a sequence", head(args));
  295.             else
  296.                 head(args);
  297.             end if;
  298.         otherwise =>
  299.             let res = #();
  300.             for (state = initial-state(args) then next-state(args, state) until (~state) )
  301.                 res := pair(current-element(args, state), res);
  302.             end for;
  303.             // make sure that last argument is a sequence here.
  304.             if (~instance?(head(res), <sequence>))
  305.                 error("apply:  last arg must be a sequence", head(args));
  306.             end if;
  307.             let argseq = head(res);
  308.             res := tail(res);
  309.             for (state = initial-state(argseq) then next-state(argseq, state) until (~state) )
  310.                 res := pair(current-element(argseq, state), res);
  311.             end for;
  312.             reverse!(res);
  313.         end case;
  314.     end collect-args;
  315.     %apply(f, collect-args(args));
  316. end method;
  317.  
  318. //
  319. // comparisons.
  320. //
  321.  
  322. //
  323. // according to IRM, = should be a generic function so it can be extended
  324. // by user classes. most primitive version just checks if operands are ==.
  325. //
  326.  
  327. //(define-method binary= (obj1 obj2) (id? obj1 obj2))
  328.  
  329. define method \= (o1, o2)
  330.     o1 == o2;
  331. end method;
  332.  
  333. // \~= just calls \= and complements the result.
  334.  
  335. define constant \~= =
  336.     method (o1, o2)
  337.         ~(o1 = o2);
  338.     end;    
  339.  
  340. // IRM definition:  < is a generic function.
  341.  
  342. define method \< (o1, o2)
  343.     error("objects have no intrinsic ordering.");
  344. end;    
  345.  
  346. // >, <=, and >= are all defined by <.
  347.  
  348. define constant \> =
  349.     method (o1, o2)
  350.         o2 < o1;
  351.     end;
  352.  
  353. define constant \<= =
  354.     method (o1, o2)
  355.         ~(o2 < o1);
  356.     end;
  357.  
  358. define constant \>= =
  359.     method (o1, o2)
  360.         ~(o1 < o2);
  361.     end;
  362.  
  363. //(define-method =hash (obj) (%=hash obj))
  364.  
  365. define method =hash (obj)
  366.     %=hash(obj);
  367. end method;
  368.  
  369. //
  370. // classes
  371. //
  372.  
  373. //(define subtype? (method ((t1 <type>) (t2 <type>))
  374. //             (%subtype? t1 t2)))
  375.  
  376. define constant subtype? =
  377.     method (t1 :: <type>, t2 :: <type>)
  378.         %subtype?(t1, t2);
  379.     end;
  380.  
  381. //(define subclass?
  382. //  (method (c1 c2)
  383. //      (princ "warning: subclass is deprecated by Dylan Design Note 5.")
  384. //      (%subtype? c1 c2)))
  385.  
  386. //(define all-superclasses (method ((c <class>))
  387. //                 (%all-superclasses c)))
  388. define constant all-superclasses = 
  389.     method (c :: <class>)
  390.         %all-superclasses(c);
  391.     end;
  392.  
  393. //(define direct-superclasses (method ((c <class>))
  394. //                    (%direct-superclasses c)))
  395. define constant direct-superclasses =
  396.     method (c :: <class>)
  397.         %direct-superclasses(c);
  398.     end;
  399.  
  400. //(define direct-subclasses (method ((c <class>))
  401. //                  (%direct-subclasses c)))
  402. define constant direct-subclasses =
  403.     method (c :: <class>)
  404.         %direct-subclasses(c);
  405.     end;
  406.  
  407. //(define-method seal ((c <class>))
  408. //  (%seal c))
  409. define method seal (c :: <class>)
  410.     %seal(c);
  411. end method;
  412.  
  413. //(define slot-initialized?
  414. //  (method (obj slot)
  415. //      (not (id? (slot obj) %uninitialized-slot-value))))
  416. define constant slot-initialized? = 
  417.     method (obj, slot)
  418.         ~(id? (slot(obj), %uninitialized-slot-value));
  419.     end;
  420.  
  421. //
  422. // types
  423. //
  424. // We need to leave this out for now because we haven't thought about
  425. // how to compare limited types in sorting applicable gf methods.
  426.  
  427. // limited <integer>
  428.  
  429. //(define-method limited ((int (singleton <integer>))
  430. //            #rest args
  431. //                #key min max)
  432. //  (%limited-integer args))
  433.  
  434. // 24 May 1994
  435. // limited <collection>
  436.  
  437. //;(define-method limited ((coll (singleton <collection>))
  438. //;            #rest args
  439. //;            #key
  440. //;            (of <type>)
  441. //;            (size (limited <integer> min: 0)))
  442. //;  (if (and (not (sealed? coll)) (instantiable? coll))
  443. //;      (%limited-collection args)
  444. //;      (error "limited: collection either sealed or not instantiable:" coll)))
  445.  
  446.  
  447. // union types
  448. //(define-method union ((t1 <type>) (t2 <type>))
  449. //  (%union-type (list t1 t2)))
  450. define method union (t1 :: <type>, t2 :: <type>)
  451.     %union-type(list(t1, t2));
  452. end method;
  453.  
  454. //(define-method union* (#rest args)
  455. //  (union (first args) (apply union (tail args))));
  456. define method union* (#rest args)
  457.     union(head(args), apply(union, tail(args)));
  458. end method;
  459.  
  460. //
  461. // collections
  462. //
  463.  
  464. //
  465. // collection.dyl - portable collection functions
  466. //
  467. // Brent Benson
  468. //
  469.  
  470. //
  471. // collections
  472. //
  473. // (size collection) => integer or #f
  474. // (class-for-copy collection) => class
  475. // (empty? collection) => boolean
  476. // (do procedure collection #rest more-collections) => #f
  477. // (map procedure collection #rest more-collections) => new-collection
  478. // (map-as class procedure collection #rest more-collections) => new-collection
  479. // (map-into mutable-col procedure collection #rest more-cols) => mutable-col
  480. // (any? procedure collection #rest more-collections) => value
  481. // (every? procedure collection #rest more-collections) => boolean
  482. // (reduce procedure initial-value collection) => value
  483. // (reduce1 procedure collection) => value
  484. // (member? value collection #key test) => boolean
  485. // (find-key collection procedure #key skip failure) => key
  486. // (replace-elements! mutable-col predicate new-value-fn #key count) => mutable-col
  487. // (fill! mutable-collection value #key start end)
  488.  
  489. //(define-generic-function element ((c <collection>) key #rest rest))
  490. define generic element (c :: <collection>, key, #rest rest);
  491.  
  492. //(define-method size ((c <collection>))
  493. //  (for ((state (initial-state c) (next-state c state))
  494. //    (the-size 0 (+ the-size 1)))
  495. //       ((not state) the-size)))
  496.  
  497. define method size (c :: <collection>)
  498.     let the-size = 0;
  499.     for (state = initial-state(c) then next-state(c, state) until (~state))
  500.         the-size := the-size + 1;
  501.     end for;
  502.     the-size;
  503. end method;
  504.  
  505. //(define-method class-for-copy ((c <collection>))
  506. //  (object-class c))
  507.  
  508. define method class-for-copy (c :: <collection>)
  509.     object-class(c);
  510. end method;
  511.  
  512. //
  513. // Added to satisfy implementation of every? below
  514. //
  515.  
  516. //(define-method class-for-copy ((p <pair>))
  517. //  <list>)
  518.  
  519. define method class-for-copy (p :: <pair>)
  520.     <list>;
  521. end method;
  522.  
  523. //(define-method class-for-copy ((b <byte-string>)) <byte-string>)
  524.  
  525. define method class-for-copy (p :: <byte-string>)
  526.     <byte-string>;
  527. end method;
  528.  
  529. //(define-method empty? ((c <collection>))
  530. //  (if (initial-state c)
  531. //      #f
  532. //      #t))
  533.  
  534. define method empty? (c :: <collection>)
  535.     if (initial-state(c))
  536.         #f;
  537.     else
  538.         #t;
  539.     end if;
  540. end method;
  541.  
  542. // map1 and map2 aren't part of the spec, but are included here
  543. // for bootstrapping purposes.
  544. //
  545. //(define-method map1 ((f <function>) (c <collection>))
  546. //  (bind ((class (class-for-copy c))
  547. //     (new (make class size: (size c))))
  548. //    (for ((state (initial-state c) (next-state c state))
  549. //      (i 0 (+ i 1)))
  550. //    ((not state) new)
  551. //      (set! (element new i) (f (current-element c state))))))
  552.  
  553. define method map1 (f :: <function>, c :: <collection>)
  554.     let cl = class-for-copy(c);
  555.     let new = make(class, size: size(c));
  556.     let index = 0;
  557.     for (state = initial-state(c) then next-state(c, state) until (~state))
  558.         new[index] := f(c[index]);
  559.         index := index + 1;
  560.     finally
  561.         new;
  562.     end for;
  563. end method;
  564.  
  565. //(define-method map2 ((f <function>) (c1 <collection>) (c2 <collection>))
  566. //  (bind ((class (class-for-copy c1))
  567. //     (new (make class size: (size c1))))
  568. //    (for ((state1 (initial-state c1) (next-state c1 state1))
  569. //      (state2 (initial-state c2) (next-state c2 state2))
  570. //      (i 0 (+ i 1)))
  571. //    ((not state1) new)
  572. //      (set! (element new i) (f (current-element c1 state1)
  573. //                   (current-element c2 state2))))))
  574.  
  575. define method map2 (f :: <function>, c1 :: <collection>, c2 :: <collection>)
  576.     let cl = class-for-copy(c1);
  577.     let new = make(class, size: size(c1));
  578.     let index = 0;
  579.     for (st1 = initial-state(c1) then next-state(c1, st1),
  580.         st2 = initial-state(c2) then next-state(c2, st2)
  581.         until (~st1))
  582.         new[index] := f(c1[index], c2[index]);
  583.         index := index + 1;
  584.     finally
  585.         new;
  586.     end for;
  587. end method;
  588.  
  589. //(define-method do ((f <function>) (c <collection>) #rest more-collections)
  590. //  (bind ((collections (pair c more-collections)))
  591. //    (for ((states (map1 initial-state collections)
  592. //              (map2 next-state collections states)))
  593. //         ((not (head states)) #f)
  594. //    (apply f (map2 current-element collections states)))))
  595.  
  596. define method do (f :: <function>, c :: <collection>, #rest more-collections)
  597.     let collections = pair(c, more-collections);
  598.     for (states = map1(initial-state, collections)
  599.         then     map2(next-state, collections, states) until (~head(states)))
  600.         apply(f, map2(current-element, collections, states));
  601.     finally
  602.         #f;
  603.     end for;
  604. end method;
  605.  
  606. //(define-method map ((f <function>) (c <collection>) #rest more-collections)
  607. //  (bind ((collections (pair c more-collections))
  608. //     (class (class-for-copy c))
  609. //     (new (make class size: (size c))))
  610. //    (for ((states (map1 initial-state collections)
  611. //          (map2 next-state collections states))
  612. //      (i 0 (+ i 1)))
  613. //    ((not (head states)) new)
  614. //      (set! (element new i) (apply f (map2 current-element collections states))))))
  615.  
  616. //(define-method map-as ((class <class>) (f <function>) (c <collection>) #rest more-collections)
  617. //  (bind ((collections (pair c more-collections))
  618. //     (new (make class size: (size c))))
  619. //    (for ((states (map1 initial-state collections)
  620. //          (map2 next-state collections states))
  621. //      (i 0 (+ i 1)))
  622. //    ((not (head states)) new)
  623. //      (set! (element new i) (apply f (map2 current-element collections states))))))
  624.  
  625. //(define-method map-into ((mc <mutable-collection>) (f <function>) #rest more-collections)
  626. //  (bind ((collections (pair mc more-collections)))
  627. //    (for ((states (map1 initial-state collections)
  628. //          (map2 next-state collections states))
  629. //      (i 0 (+ i 1)))
  630. //    ((not (head states)) mc)
  631. //      (set! (element mc i) (apply f (map2 current-element collections states))))))
  632.  
  633. //(define-method any? ((f <function>) (c <collection>) #rest more-collections)
  634. //  (bind ((collections (pair c more-collections))
  635. //     (ret #f))
  636. //    (for ((states (map1 initial-state collections)
  637. //          (map2 next-state collections states))
  638. //      (i 0 (+ i 1)))
  639. //    ((or (not (head states)) ret) ret)
  640. //      (set! ret (apply f (map2 current-element collections states))))))
  641.  
  642. //(define-method every? ((f <function>) (c <collection>) #rest more-collections)
  643. //  (bind ((collections (pair c more-collections))
  644. //     (ret #t))
  645. //    (for ((states (map1 initial-state collections)
  646. //          (map2 next-state collections states))
  647. //      (i 0 (+ i 1)))
  648. //    ((or (not (head states)) (not ret)) ret)
  649. //      (set! ret (apply f (map2 current-element collections states))))))
  650.  
  651. //(define-method reduce ((f <function>) init-value (c <collection>))
  652. //  (bind ((value init-value))
  653. //    (for ((state (initial-state c) (next-state c state)))
  654. //    ((not state) value)
  655. //      (set! value (f value (current-element c state))))))
  656.  
  657. define method reduce (f :: <function>, init-value, c :: <collection>)
  658.     let value = init-value;
  659.     for (state = initial-state(c) then next-state(c, state) until (~state))
  660.         value := f(value, current-element(c, state));
  661.     finally
  662.         value;
  663.     end for;
  664. end method;
  665.  
  666. //(define-method reduce1 ((f <function>) (c <collection>))
  667. //  (bind ((first-state (initial-state c))
  668. //     (value (current-element c first-state)))
  669. //    (for ((state (next-state c first-state) (next-state c state)))
  670. //    ((not state) value)
  671. //      (set! value (f value (current-element c state))))))
  672.  
  673. define method reduce1 (f :: <function>, c :: <collection>)
  674.     let first-state = initial-state(c);
  675.     let value = current-element(c, first-state);
  676.     for (state = next-state(c, first-state) then next-state(c, state) until (~state))
  677.         value := f(value, current-element(c, state));
  678.     finally
  679.         value;
  680.     end for;
  681. end method;
  682.  
  683. // for example:
  684. // define method sum (l :: <list>) reduce1(\+, l); end method;
  685. // sum(#(1,2,3) --> 6
  686.  
  687. //(define-method member? (value (c <collection>) #key (test id?))
  688. //  (bind ((ret #f))
  689. //    (for ((state (initial-state c) (next-state c state)))
  690. //    ((or (not state) ret) ret)
  691. //      (set! ret (test (current-element c state) value)))))
  692.  
  693. define method member? (value, c :: <collection>, #key test (id?))
  694.     let ret = #f;
  695.     for (state = initial-state(c) then next-state(c, state) until (~state | ret))
  696.         ret := test(current-element(c, state), value);
  697.     finally
  698.         ret;
  699.     end for;
  700. end method;
  701.  
  702. //(define-method find-key ((c <collection>) (f <function>) #key (skip 0) (failure #f))
  703. //  (bind ((keys (key-sequence c)))
  704. //    (bind-exit (exit)
  705. //      (for ((state (initial-state keys) (next-state keys state))
  706. //        (i 0 (+ i 1)))
  707. //      ((not state) failure)
  708. //    (when (>= i skip)
  709. //      (bind ((cur (current-element keys state)))
  710. //        (when (f (element c cur))
  711. //          (exit cur))))))))
  712.  
  713. //(define-method replace-elements! ((mc <mutable-collection>) 
  714. //                  (pred <function>)
  715. //                  (new-value-fn <function>)
  716. //                  #key (count #f))
  717. //  (for ((state (initial-state mc) (next-state mc state))
  718. //    (cur-count 0 (+ cur-count 1)))
  719. //      ((or (not state) (> cur-count count)) mc)
  720. //    (if (pred (current-element mc state))
  721. //    (set! (current-element mc state) (new-value fn (current-element mc state))))))
  722.  
  723. //(define-method fill! ((mc <mutable-collection>) value)
  724. //  (for ((state (initial-state mc) (next-state mc state)))
  725. //      ((not state) mc)
  726. //    (print value)
  727. //    (set! (current-element mc state) value)))
  728.  
  729. //(define-method fill! ((ms <mutable-sequence>) value #key (start 0) (end (size ms)))
  730. //  (for ((i start (+ i 1)))
  731. //      ((>= i end) ms)
  732. //    (set! (element ms i) value)))
  733.  
  734. define method fill! (ms :: <mutable-sequence>, value, #key start (0), finish (size(ms)))
  735.     for (i :: <integer> from start to finish)
  736.         ms[i] := value;
  737.     finally
  738.         ms;
  739.     end for;
  740. end method;
  741.  
  742. //
  743. // sequences
  744. //
  745. // (add sequence new-element) => new-sequence
  746. // (add! sequence1 new-element) => sequence2
  747. // (add-new sequence new-element #key test) => new-sequence
  748. // (add-new! sequence1 new-element #key test) => sequence2
  749. // (remove sequence value #key test count) => new-sequence
  750. // (remove! sequence1 value #key test count) => sequence2
  751. // (choose predicate sequence) => new-sequence
  752. // (choose-by predicate test-sequence value-sequence) => new-sequence
  753. // (intersection sequence1 sequence2 #key test) => new-sequence
  754. // (union sequence1 sequence2 #key test) => new-sequence
  755. // (remove-duplicates sequence #key test) => new-sequence
  756. // (remove-duplicates! sequence1 #key test) => sequence2
  757. // (copy-sequence source #key start end) => new-sequence
  758. // (concatenate-as class sequence1 #rest more-sequences) => new-sequence
  759. // (concatenate sequence1 #rest sequences) => new-sequence
  760. // (replace-subsequence! mutable-sequence insert-sequence #key start) => sequence
  761. // (reverse sequence) => new-sequence
  762. // (reverse! sequence1) => sequence2
  763. // (sort sequence #key test stable) => new-sequence
  764. // (sort! sequence1 #key test stable) => sequence2
  765. // (first sequence) => value
  766. // (second sequence) => value
  767. // (third sequence) => value
  768. // (first-setter sequence new-value) => new-value
  769. // (second-setter sequence new-value) => new-value
  770. // (third-setter sequence new-value) => new-value
  771. // (last sequence) => value
  772. // (subsequence-position big pattern #key test count) => index
  773. //
  774. // others
  775.  
  776. //(define-method add ((s <sequence>) new-el)
  777. //  (bind ((class (class-for-copy s))
  778. //     (new (make class size: (+ (size s) 1))))
  779. //    (for ((state1 (initial-state s) (if state1 (next-state s state1) #f))
  780. //      (state2 (initial-state new) (next-state new state2)))
  781. //    ((not state2) new)
  782. //      (if state1
  783. //      (set! (current-element new state2) (current-element s state1))
  784. //      (set! (current-element new state2) new-el)))))
  785.  
  786. //(define-method add! ((s <sequence>) new-el)
  787. //  (bind ((class (class-for-copy s))
  788. //     (new (make class size: (+ (size s) 1))))
  789. //    (for ((state1 (initial-state s) (if state1 (next-state s state1) #f))
  790. //      (state2 (initial-state new) (next-state new state2)))
  791. //    ((not state2) new)
  792. //      (if state1
  793. //      (set! (current-element new state2) (current-element s state1))
  794. //      (set! (current-element new state2) new-el)))))
  795.  
  796. //(define-method add-new ((s <sequence>) new-el #key (test id?))
  797. //  (if (member? new-el s test: test)
  798. //      s
  799. //      (add s new-el)))
  800.  
  801. //(define-method add-new! ((s <sequence>) new-el #key (test id?))
  802. //  (if (member? new-el s test: test)
  803. //      s
  804. //      (add! s new-el)))
  805.  
  806. //(define-method remove ((s <sequence>) value #key (test id?) count)
  807. //  (bind-methods ((new-as-list (s state cur-count)
  808. //           (cond
  809. //            ((not state) '())
  810. //            ((and count (>= cur-count count))
  811. //             (pair (current-element s state) 
  812. //               (new-as-list s (next-state s state) cur-count)))
  813. //            ((test (current-element s state) value)
  814. //             (new-as-list s (next-state s state) (+ cur-count 1)))
  815. //            (else:
  816. //             (pair (current-element s state) 
  817. //               (new-as-list s (next-state s state) cur-count))))))
  818. //    (bind ((class (class-for-copy s))
  819. //       (new-list (new-as-list s (initial-state s) 0)))
  820. //      (as class new-list))))
  821.  
  822. //(define-method remove! ((s <sequence>) value #key (test id?) count)
  823. //  (bind-methods ((new-as-list (s state cur-count)
  824. //           (cond
  825. //            ((not state) '())
  826. //            ((and count (>= cur-count count))
  827. //             (pair (current-element s state) 
  828. //               (new-as-list s (next-state s state) cur-count)))
  829. //            ((test (current-element s state) value)
  830. //             (new-as-list s (next-state s state) (+ cur-count 1)))
  831. //            (else:
  832. //             (pair (current-element s state) 
  833. //               (new-as-list s (next-state s state) cur-count))))))
  834. //    (bind ((class (class-for-copy s))
  835. //       (new-list (new-as-list s (initial-state s) 0)))
  836. //      (as class new-list))))
  837.  
  838. //(define-method choose ((pred <function>) (s <sequence>))
  839. //  (bind-methods ((new-as-list (s state)
  840. //                  (cond
  841. //           ((not state) '())
  842. //           ((pred (current-element s state))
  843. //            (pair (current-element s state)
  844. //              (new-as-list s (next-state s state))))
  845. //           (else: (new-as-list s (next-state s state))))))
  846. //    (bind ((class (class-for-copy s))
  847. //       (new-list (new-as-list s (initial-state s))))
  848. //      (as class new-list))))
  849.  
  850. //(define-method choose-by ((pred <function>) (ts <sequence>) (vs <sequence>))
  851. //  (bind-methods ((new-as-list (ts ts-state vs vs-state)
  852. //                  (cond
  853. //           ((not state1) '())
  854. //           ((pred (current-element ts ts-state))
  855. //            (pair (current-element vs vs-state)
  856. //              (new-as-list ts (next-state ts ts-state)
  857. //                       vs (next-state vs vs-state))))
  858. //           (else: (new-as-list ts (next-state ts ts-state)
  859. //                       vs (next-state vs vs-state))))))
  860. //    (bind ((class (class-for-copy s))
  861. //       (new-list (new-as-list ts (initial-state ts)
  862. //                  vs (initial-state vs))))
  863. //      (as class new-list))))
  864.  
  865. //(define-method intersection ((s1 <sequence>) (s2 <sequence>) #key (test id?))
  866. //  (bind ((new-list '())
  867. //     (class (class-for-copy s1)))
  868. //    (for ((state1 (initial-state s1) (next-state s1 state1)))
  869. //    ((not state1))
  870. //      (bind ((el (current-element s1 state1)))
  871. //    (when (member? el s2 test: test)
  872. //       (set! new-list (pair el new-list)))))
  873. //    (as class new-list)))
  874.  
  875. //(define-method union ((s1 <sequence>) (s2 <sequence>) #key (test id?))
  876. //  (bind ((new (copy-sequence s2)))
  877. //    (for ((state1 (initial-state s1) (next-state s1 state1)))
  878. //    ((not state1) new)
  879. //      (set! new (add-new! new (current-element s1 state1) test: test)))))
  880.                   
  881. //(define-method remove-duplicates ((s <sequence>) #key (test id?))
  882. //  (bind ((new-list '()))
  883. //    (for ((state1 (initial-state s) (next-state s state1)))
  884. //    ((not state1))
  885. //      (bind ((already-there #f))
  886. //    (for ((state2 (initial-state s) (next-state s state2)))
  887. //        ((or already-there (not state)))
  888. //      (if (test (current-element s state1) (current-element s state2))
  889. //          (set! already-there #t)))
  890. //    (if (not already-there)
  891. //        (set! new-list (pair (current-element s state1))))))
  892. //    (as (class-for-copy s) new-list)))
  893.  
  894. //(define-method remove-duplicates! ((s <sequence>) #key (test id?))
  895. //  (bind ((new-list '()))
  896. //    (for ((state1 (initial-state s) (next-state s state1)))
  897. //    ((not state1))
  898. //      (bind ((already-there #f))
  899. //    (for ((state2 (initial-state s) (next-state s state2)))
  900. //        ((or already-there (not state)))
  901. //      (if (test (current-element s state1) (current-element s state2))
  902. //          (set! already-there #t)))
  903. //    (if (not already-there)
  904. //        (set! new-list (pair (current-element s state1))))))
  905. //    (as (class-for-copy s) new-list)))
  906.  
  907. //(define-method copy-sequence ((s <sequence>) #key (start 0) (end (size s)))
  908. //  (bind ((new (make (class-for-copy s) size: (- end start))))
  909. //    (for ((state1 (initial-state s) (next-state s state1))
  910. //      (state2 (initial-state new) (next-state new state2)))
  911. //    ((not state1) new)
  912. //      (set! (current-element new state2) (current-element s state1)))))
  913.  
  914. //(define-method concatenate-as ((class <class>) (s <sequence>) #rest more-seq)
  915. //  (bind ((new (apply concatenate s more-seq)))
  916. //    (as class new)))
  917.  
  918. //(define-method concatenate ((s <sequence>) #rest more-seq)
  919. //  (bind-methods ((help (s more)
  920. //          (if (empty? more)
  921. //              s
  922. //              (help (concatenate2 s (head more))
  923. //                (tail more))))
  924. //         (concatenate2 ((s1 <sequence>) (s2 <sequence>))
  925. //                  (bind ((size1 (size s1))
  926. //             (size2 (size s2))
  927. //             (new-size (+ size1 size2))
  928. //             (new (make (class-for-copy s1) size: new-size)))
  929. //            (for ((i 0 (+ i 1)))
  930. //            ((>= i new-size) new)
  931. //              (if (< i size1)
  932. //              (set! (element new i) (element s1 i))
  933. //              (set! (element new i) (element s2 (- i size1))))))))
  934. //    (help s more-seq)))
  935.  
  936. //(define-method replace-subsequence! ((ms <mutable-sequence>) 
  937. //                     (is <sequence>) 
  938. //                     #key (start 0))
  939. //  (for ((i 0 (+ i 1)))
  940. //      ((>= i (size is)) ms)
  941. //    (set! (element ms (+ i start)) (element is i))))
  942.  
  943. //(define-method reverse ((s <sequence>))
  944. //  (bind ((seq-size (size s))
  945. //     (new (make (class-for-copy s) size: seq-size)))
  946. //    (for ((i 0 (+ i 1)))
  947. //    ((>= i seq-size) new)
  948. //      (set! (element new i) (element s (- seq-size i 1))))))
  949.  
  950. //
  951. // check me
  952. //
  953.  
  954. //(define-method reverse! ((s <sequence>))
  955. //  (bind ((seq-size (size s))
  956. //     (seq-size/2 (/ seq-size 2)))
  957. //    (for ((i 0 (+ i 1)))
  958. //    ((>= i seq-size/2) s)
  959. //      (bind ((temp (element s i))
  960. //         (j (- seq-size i 1)))
  961. //    (element-setter s i (element s j))
  962. //    (element-setter s j temp)))))
  963.  
  964. //(define-method sort ((s <sequence>) #key (test <) (stable #t))
  965. //  (if (not stable)
  966. //      (error "sort: cannot sort a non-stable sequence" s)
  967. //      (sort! (copy-sequence s) test: test stable: stable)))
  968.  
  969. define method sort (s :: <sequence>, #key test (\<), stable (#t))
  970.     if (~stable)
  971.         error("sort: cannot sort a non-stable sequence", s);
  972.     else
  973.         sort!(copy-sequence(s), test: test, stable: stable);
  974.     end if;
  975. end method;
  976.  
  977. //(define-method sort! ((s <sequence>) #key (test <) (stable #t))
  978. //  (if (not stable)
  979. //      (error "sort!: cannot sort a non-stable sequence" s)
  980. //      (error "sort!: unimplemented" s)))
  981.  
  982. define method sort! (s :: <sequence>, #key test (\<), stable (#t))
  983.     if (~stable)
  984.         error("sort: cannot sort a non-stable sequence", s);
  985.     else
  986.         error("sort!: unimplemented", s);
  987.     end if;
  988. end method;
  989.  
  990. //(define-method first ((s <sequence>) #key (default %default-object))
  991. //  (element s 0 default: default))
  992. //(define-method second ((s <sequence>) #key (default %default-object))
  993. //  (element s 1 default: default))
  994. //(define-method third ((s <sequence>) #key (default %default-object))
  995. //  (element s 2 default: default))
  996.  
  997. define method first (s :: <sequence>, #key default (%default-object))
  998.     element(s, 0, default: default);
  999. end method;
  1000. define method second (s :: <sequence>, #key default (%default-object))
  1001.     element(s, 1, default: default);
  1002. end method;
  1003. define method third (s :: <sequence>, #key default (%default-object))
  1004.     element(s, 2, default: default);
  1005. end method;
  1006.  
  1007. //(define-method first-setter ((s <sequence>) el) (set! (element s 0) el))
  1008. //(define-method second-setter ((s <sequence>) el) (set! (element s 1) el))
  1009. //(define-method third-setter ((s <sequence>) el) (set! (element s 2) el))
  1010.  
  1011. define method first-setter (s :: <sequence>, el) s[0] := el; end method;
  1012. define method second-setter (s :: <sequence>, el) s[1] := el; end method;
  1013. define method third-setter (s :: <sequence>, el) s[2] := el; end method;
  1014.  
  1015. //(define-method last ((s <sequence>) #key (default %default-object))
  1016. //  (bind ((size (size s)))
  1017. //    (case size
  1018. //      ((0 #f) (if (id? default %default-object)
  1019. //              (if (= size 0)
  1020. //              (error "last applied to empty sequence")
  1021. //              (error "last applied to unbounded sequence"))
  1022. //              default))
  1023. //      (else: (element s (- size 1))))))
  1024.  
  1025. define method last (s :: <sequence>, #key default (%default-object))
  1026.     let sz = size(s);
  1027.     if (sz = 0 | sz = #f)
  1028.         if (id?(default, %default-object))
  1029.             if (sz = 0)
  1030.                 error("last applied to empty sequence");
  1031.             else
  1032.                 error("last applied to unbounded sequence");
  1033.             end if;
  1034.         else
  1035.             default;
  1036.         end if;
  1037.     else
  1038.         s[sz - 1];
  1039.     end if;
  1040. end method;
  1041.  
  1042. //(define-method last-setter ((s <sequence>) new-value)
  1043. //  (bind ((size (size s)))
  1044. //    (case size
  1045. //      ((0) (error "last-setter applied to empty sequence"))
  1046. //      ((#f) (error "last-setter applied to unbounded sequence"))
  1047. //      (else: (element-setter s (- size 1) new-value)))))
  1048.  
  1049. define method last-setter (s :: <sequence>, new-value)
  1050.     let sz = size(s);
  1051.     if (sz = 0)
  1052.         error("last-setter applied to empty sequence");
  1053.     else
  1054.         if (~sz)
  1055.             error("last-setter applied to unbounded sequence");
  1056.         else
  1057.             s[sz - 1] := new-value;
  1058.         end if;
  1059.     end if;
  1060. end method;
  1061.  
  1062. //(define-method subsequence-position (bit pattern #key (test id?) count) 'unimplemented)
  1063.  
  1064. //
  1065. // convert from one collection type to another
  1066. //
  1067. //(define-method as ((new-class <class>) (c <collection>))
  1068. //  (if (instance? c new-class)
  1069. //      c
  1070. //      (bind ((new (make new-class size: (size c))))
  1071. //    (for ((state1 (initial-state c) (next-state c state1))
  1072. //          (state2 (initial-state new) (next-state new state2)))
  1073. //       ((not state1) new)
  1074. //     (set! (current-element new state2) (current-element c state1))))))
  1075.  
  1076. //(define-method key-sequence ((s <sequence>))
  1077. //  (bind ((res '()))
  1078. //    (for ((state (initial-state s) (next-state s state))
  1079. //      (i 0 (+ i 1)))
  1080. //    ((not state) res)
  1081. //      (set! res (pair i res)))))
  1082.  
  1083. //(define-method binary= ((s1 <sequence>) (s2 <sequence>))
  1084. //   (for ((state1 (initial-state s1) (next-state s1 state1))
  1085. //     (state2 (initial-state s2) (next-state s2 state2)))
  1086. //    ((if (not state1)
  1087. //         #t
  1088. //         (not (binary= (current-element s1 state1)
  1089. //               (current-element s2 state2))))
  1090. //     (and (not state1) (not state2)))))
  1091.  
  1092. // end collection.dyl
  1093.  
  1094. //
  1095. // list.dyl - list operations
  1096. //
  1097. // Brent Benson
  1098. //
  1099.  
  1100. //
  1101. // list specific operations
  1102. //
  1103.  
  1104. //(define-method pair (car cdr) (%pair car cdr))
  1105. define method pair (car, cdr) %pair(car, cdr); end method;
  1106.  
  1107. //(define-method list (#rest els) els)
  1108. define method list (#rest els) els end method;
  1109.  
  1110. //(define-method head ((p <pair>)) (%head p))
  1111. define method head (p :: <pair>) %head(p); end method;
  1112.  
  1113. //(define-method tail ((p <pair>)) (%tail p))
  1114. define method tail (p :: <pair>) %tail(p); end method;
  1115.  
  1116. //(define-method head-setter ((p <pair>) obj) (%head-setter p obj))
  1117. define method head-setter (p :: <pair>, obj)
  1118.     %head-setter(p, obj);
  1119. end method;
  1120.  
  1121. //(define-method tail-setter ((p <pair>) obj) (%tail-setter p obj))
  1122. define method tail-setter (p :: <pair>, obj)
  1123.     %tail-setter(p, obj);
  1124. end method;
  1125.  
  1126. //
  1127. // synonyms for lisp hackers -- deprecated!
  1128. //
  1129. //(define-method car ((p <pair>))
  1130. //  (princ "warning: car is deprecated by Dylan Design Note 16.")
  1131. //  (%head p))
  1132. //(define-method cdr ((p <pair>))
  1133. //  (princ "warning: cdr is deprecated by Dylan Design Note 16.")
  1134. //  (%tail p))
  1135. //(define-method cons (car cdr)
  1136. //  (princ "warning: cons is deprecated by Dylan Design Note 16.")
  1137. //  (%pair car cdr))
  1138.  
  1139. //
  1140. // generic sequence operations
  1141. //
  1142.  
  1143. //(define-method add ((l <list>) el) (pair el (copy-sequence l)))
  1144. //(define-method add! ((l <list>) el) (pair el l))
  1145.  
  1146. define method add(l :: <list>, el)
  1147.     pair(el, copy-sequence(l));     // can't share structure.
  1148. end method;
  1149. define method add!(l :: <list>, el) pair(el, l); end method;
  1150.  
  1151. //(define-method add-new ((l <list>) el #key (test id?))
  1152. //  (if (not (member? el l test: test))
  1153. //      (add l el)
  1154. //      l))
  1155.  
  1156. //(define-method add-new! ((l <list>) el #key (test id?))
  1157. //  (if (not (member? el l test: test))
  1158. //      (add! l el)
  1159. //      l))
  1160.  
  1161. //(define-method remove ((l <list>) el #key (test id?) (count #f))
  1162. //  (bind-methods ((help (l el c)
  1163. //           (cond
  1164. //            ((empty? l) l)
  1165. //            ((test (head l) el) (if (and count (>= c count))
  1166. //                        (copy-sequence l)
  1167. //                        (help (tail l) el (+ c 1))))
  1168. //            (else: (pair (head l) (help (tail l) el c))))))
  1169. //    (help l el 0)))
  1170.  
  1171. //(define-method remove! ((orig <list>) el #key (test id?) (count #f))
  1172. //  (bind-methods ((help (lst last c)
  1173. //               (cond
  1174. //            ((empty? lst) '())
  1175. //            ((test (head l) el) (if (and count (>= c count))
  1176. //                        lst
  1177. //                        (help (tail lst) (head lst) (+ c 1))))
  1178. //            (else: ))))))  
  1179.  
  1180. //(define-method choose ((pred <function>) (l <list>))
  1181. //  (cond
  1182. //   ((empty? l) l)
  1183. //   ((pred (head l)) (pair (head l) (choose pred (tail l))))
  1184. //   (else: (choose pred (tail l)))))
  1185.  
  1186. //(define-method choose-by ((pred <function>) (test-list <list>) (value-list <list>))
  1187. //  (cond
  1188. //   ((and (empty? test-list) (empty? value-list)) '())
  1189. //   ((or (empty? test-list) (empty? value-list))
  1190. //    (error "choose-by: test list and value list have different sizes" test-list value-list))
  1191. //   ((pred (head test-list)) (pair (head value-list) 
  1192. //                  (choose-by pred (tail test-list) (tail value-list))))
  1193. //   (else: (choose-by pred (tail test-list) (tail value-list)))))
  1194.  
  1195. //(define-method intersection ((l1 <list>) (l2 <list>) #key (test id?))
  1196. //  (bind ((res '()))
  1197. //    (for ((state (initial-state l1) (next-state l1 state)))
  1198. //      ((not state) res)
  1199. //      (bind ((cur (current-element l1 state)))
  1200. //    (when (member? cur l2 test: test)
  1201. //      (set! res (pair cur res)))))))
  1202.  
  1203. //(define-method union ((l1 <list>) (l2 <list>) #key (test id?))
  1204. //  (for ((state (initial-state l1) (next-state l1 state)))
  1205. //      ((not state) l2)
  1206. //    (set! l2 (add-new! l2 (current-element l1 state) test: test))))
  1207.  
  1208. //(define-method remove-duplicates ((l <list>) #key (test id?))
  1209. //  (bind-methods ((help (l)
  1210. //                   (cond
  1211. //            ((empty? l) '())
  1212. //            ((member? (head l) (tail l) test: id?)
  1213. //             (help (tail l)))
  1214. //            (else: (pair (head l) (help (tail l)))))))
  1215. //    (help l)))
  1216.  
  1217. //(define-method remove-duplicates! ((l <list>) #key (test id?)) 'unimplemented)
  1218.  
  1219. //(define-method copy-sequence ((l <list>))
  1220. //  (if (empty? l)
  1221. //      l
  1222. //      (pair (head l) (copy-sequence (tail l)))))
  1223. define method copy-sequence (l :: <list>)
  1224.     pair(head(l), copy-sequence(tail(l)));
  1225. end method;
  1226. define method copy-sequence (l == #())
  1227.     #()
  1228. end method;
  1229.  
  1230. //(define-method concatenate-as ((c <class>) (l <list>) #rest more-sequences) 'unimplemented)
  1231.  
  1232. //(define-method append2 ((l1 <list>) (l2 <list>)) (%list-append l1 l2))
  1233. define method append2 (l1 :: <list>, l2 :: <list>)
  1234.     %list-append(l1, l2);
  1235. end method;
  1236.  
  1237. //(define-method concatenate ((s <list>) #rest more-sequences)
  1238. //  (bind-methods ((help ((s <sequence>) (more <list>))
  1239. //                   (if (empty? more)
  1240. //               s
  1241. //               (help (append2 s (head more))
  1242. //                 (tail more)))))
  1243. //   (help s more-sequences)))
  1244.  
  1245. //(define-method replace-subsequence! ((l <list>) (insert <list>) #key (start 0)) 'unimplemented)
  1246.  
  1247. //(define-method reverse ((l <list>)) (%list-reverse l))
  1248. //(define-method reverse! ((l <list>)) (%list-reverse! l))
  1249.  
  1250. define method reverse (l :: <list>)
  1251.     %list-reverse(l);
  1252. end method;
  1253. define method reverse! (l :: <list>)
  1254.     %list-reverse!(l);
  1255. end method;
  1256.  
  1257. //(define-method sort ((l <list>) #key (test id?)) 'unimplemented)
  1258. //(define-method sort! ((l <list>) #key (test id?)) 'unimplemented)
  1259.  
  1260. //(define-method first-setter ((l <list>) obj) (%head-setter l obj))
  1261. //(define-method second-setter ((l <list>) obj) (head-setter (tail l) obj))
  1262. //(define-method third-setter ((l <list>) obj) (head-setter (tail (tail l)) obj))
  1263. //(define-method last ((l <list>) #key (default %default-object))
  1264. //  (%list-last l default))
  1265.  
  1266. //(define-method subsequence-position ((l <list>) pattern #key (test id?) (count 0))
  1267. //    'unimplemented)
  1268.  
  1269. //
  1270. // faster versions collection operations for <list>.
  1271. //
  1272.  
  1273. //(define-method size ((l <list>)) (%list-length l))
  1274. define method size (l :: <list>) %list-length(l); end method;
  1275.  
  1276. //(define-method length ((l <list>)) (%list-length l))
  1277. define method length (l :: <list>) %list-length(l); end method;
  1278.  
  1279. //(define-method empty? ((l <list>)) (id? l '()))
  1280. define method empty? (l == #()) #t; end method;
  1281. define method empty? (l :: <list>) #f; end method;
  1282.  
  1283. //(define-method map1 ((f <function>) (l <list>)) (%list-map1 f l))
  1284. define method map1 (f :: <function>, l :: <list>) %list-map1(f, l); end method;
  1285.  
  1286. //(define-method map ((f <function>) (l <list>) #rest more-lists)
  1287. //  (if (empty? more-lists)
  1288. //      (map1 f l)
  1289. //      (bind-methods ((help (lists)
  1290. //               (if (empty? (head lists))
  1291. //                   '()
  1292. //                   (pair (apply f (map1 head lists))
  1293. //                     (help (map1 tail lists))))))
  1294. //            (help (pair l more-lists)))))
  1295.  
  1296. define method map (f :: <function>, l :: <list>, #rest more-lists)
  1297.     if (empty?(more-lists))
  1298.         map1(f, l);
  1299.     else
  1300.         local method help (lists)
  1301.             if (empty?(head(lists)))
  1302.                 #();
  1303.             else
  1304.                 pair(apply(f, map1(head, lists)), help(map1(tail, lists)));
  1305.             end if;
  1306.         end help;
  1307.         help(pair(l, more-lists));
  1308.     end if;
  1309. end method;
  1310.  
  1311. //(define-method reduce ((f <function>) i (l <list>)) (%list-reduce f i l))
  1312. //(define-method reduce1 ((f <function>) (l <list>)) (%list-reduce1 f l))
  1313. //(define-method member? (el (l <list>) #key (test id?)) (%list-member? el l test))
  1314.  
  1315. define method reduce (f :: <function>, i, l :: <list>)
  1316.     %list-reduce(f, i, l);
  1317. end method;
  1318. define method reduce1 (f :: <function>, l :: <list>)
  1319.     %list-reduce1(f, l);
  1320. end method;
  1321. define method member? (el, l :: <list>, #key test (id?))
  1322.     %list-member?(el, l, test);
  1323. end method;
  1324.  
  1325. // member?(3, #(1,2,3));
  1326.  
  1327. //(define-method first ((l <list>) #key (default %default-object))
  1328. //  (%first l default))
  1329. //(define-method second ((l <list>) #key (default %default-object))
  1330. //  (%second l default))
  1331. //(define-method third ((l <list>) #key (default %default-object))
  1332. //  (%third l default))
  1333.  
  1334. define method first (l :: <list>, #key default (%default-object))
  1335.     %first(l, default);
  1336. end method;
  1337. define method second (l :: <list>, #key default (%default-object))
  1338.     %second(l, default);
  1339. end method;
  1340. define method third (l :: <list>, #key default (%default-object))
  1341.     %third(l, default);
  1342. end method;
  1343.  
  1344. //(define-method element ((l <list>) (i <integer>) #key (default %default-object))
  1345. //  (%list-element p i default))
  1346.  
  1347. define method element (l :: <list>, i :: <integer>, #key default (%default-object))
  1348.     %list-element(l, i, default);
  1349. end method;
  1350.  
  1351. //(define-method element-setter ((l <list>) (i <integer>) val)
  1352. //  (%list-element-setter l i val))
  1353.  
  1354. define method element-setter (l :: <list>, i :: <integer>, val)
  1355.     %list-element-setter(l, i, val);
  1356. end method;
  1357.  
  1358. //
  1359. // iteration protocol
  1360. //
  1361.  
  1362. //(define-method forward-iteration-protocol ((c <collection>))
  1363. //  (values 
  1364. //   (initial-state c)
  1365. //   (%collection-limit c)
  1366. //   next-state
  1367. //   finished-state?
  1368. //   current-key
  1369. //   current-element
  1370. //   current-element-setter
  1371. //   copy-state))
  1372.  
  1373. define method forward-iteration-protocol (c :: <collection>)
  1374.     values(
  1375.         initial-state(c),
  1376.         %collection-limit(c),
  1377.         next-state,
  1378.         finished-state?,
  1379.         current-key,
  1380.         current-element,
  1381.         current-element-setter,
  1382.         copy-state);
  1383. end method;
  1384.  
  1385. //(define-method backward-iteration-protocol ((c <collection>))
  1386. //  (values
  1387. //   (final-state c)
  1388. //   (%collection-limit c)
  1389. //   previous-state
  1390. //   finished-state?
  1391. //   current-key
  1392. //   current-element
  1393. //   current-element-setter
  1394. //   copy-state))
  1395.  
  1396. define method backward-iteration-protocol (c :: <collection>)
  1397.     values(
  1398.         final-state(c),
  1399.         %collection-limit(c),
  1400.         previous-state,
  1401.         finished-state?,
  1402.         current-key,
  1403.         current-element,
  1404.         current-element-setter,
  1405.         copy-state);
  1406. end method;
  1407.  
  1408. //(define-method %collection-limit ((c <collection>)) #f)
  1409. define method %collection-limit (c :: <collection>) #f end method;
  1410.  
  1411. //(define-method finished-state? ((c <collection>) state limit)
  1412. //  (id? state limit))
  1413. define method finished-state? (c :: <collection>, state, limit)
  1414.     id?(state, limit);
  1415. end method;
  1416.  
  1417. //(define-method initial-state ((l <list>))
  1418. //  (if (id? l '())
  1419. //      #f
  1420. //      l))
  1421.  
  1422. define method initial-state (l :: <list>)
  1423.     if (id?(l, #()))
  1424.         #f;
  1425.     else
  1426.         l;
  1427.     end if;
  1428. end method;
  1429.  
  1430. //(define-method next-state ((l <list>) (s <list>))
  1431. //  (cond
  1432. //   ((empty? s) #f)
  1433. //   ((empty? (tail s)) #f)
  1434. //   (#t (tail s))))
  1435.  
  1436. define method next-state (l :: <list>, state :: <list>)
  1437.     case
  1438.         empty?(state) => #f;
  1439.         empty?(tail(state)) => #f;
  1440.         otherwise => tail(state);
  1441.     end case;
  1442. end method;
  1443.  
  1444. define method current-key (c :: <collection>, state)
  1445.     error("Don't know how to find current key", c);
  1446. end method;
  1447.  
  1448. //(define-method current-element ((c <collection>) state)
  1449. //   (error "Don't know how to find current element" c))
  1450.  
  1451. define method current-element (c :: <collection>, state)
  1452.     error("Don't know how to find current element", c);
  1453. end method;
  1454.  
  1455. //(define-method current-element ((l <list>) (state <list>))
  1456. //  (head state))
  1457.  
  1458. define method current-element (l :: <list>, state :: <list>)
  1459.     head(state);
  1460. end method;
  1461.  
  1462. //(define-method current-element-setter ((l <list>) (s <pair>) obj)
  1463. //  (%head-setter s obj))
  1464.  
  1465. define method current-element-setter (l :: <list>, s :: <pair>, obj)
  1466.     %head-setter(s, obj);
  1467. end method;
  1468.  
  1469. //(define-method copy-state ((l <list>) s)
  1470. //  (copy-sequence s))
  1471.  
  1472. define method copy-state (l :: <list>, s :: <list>)
  1473.     copy-sequence(s);
  1474. end method;
  1475.  
  1476. //
  1477. // comparisons
  1478. //
  1479.  
  1480. //(define-method binary= ((p1 <pair>) (p2 <pair>))
  1481. //  (and (binary= (head p1) (head p2))
  1482. //       (binary= (tail p1) (tail p2))))
  1483.  
  1484. define method \= (p1 :: <pair>, p2 :: <pair>)
  1485.     head(p1) = head(p2) & tail(p1) = tail(p2);
  1486. end method;
  1487.  
  1488. // end list.dyl
  1489.  
  1490. //
  1491. // range.dyl
  1492. //
  1493. // range operations
  1494. //
  1495. //(define-class <range> (<sequence>)
  1496. //  (from    init-value:  0 init-keyword: from:)
  1497. //  (to      init-value: #f init-keyword: to:)
  1498. //  (above   init-value: #f init-keyword: above:)
  1499. //  (below   init-value: #f init-keyword: below:)
  1500. //  (by      init-value:  1 init-keyword: by:)
  1501. //  (size    init-value: #f init-keyword: size:))
  1502.  
  1503. //(define-method initialize ((range <range>) #rest args)
  1504. //  (bind ((from (from range))
  1505. //     (to (to range))
  1506. //     (above (above range))
  1507. //     (below (below range))
  1508. //     (by (by range))
  1509. //     (bmax (method (x y) (if x
  1510. //                 (max x y)
  1511. //                 y))))
  1512. //    (if (id? by 0)
  1513. //        (size-setter range #f)
  1514. //        (bind ((new-size (size range)))
  1515. //          (if to
  1516. //              (set! new-size 
  1517. //                (as <integer> (+ (/ (- to from) by) 1)))
  1518. //              #f)
  1519. //          (if above
  1520. //              (if (< by 0)
  1521. //              (set! new-size
  1522. //                (as <integer> (bmax new-size
  1523. //                            (/ (- above from) by))))
  1524. //              (set! new-size 0))
  1525. //              #f)
  1526. //          (if below
  1527. //              (if (> by 0)
  1528. //              (set! new-size
  1529. //                (as <integer> (bmax new-size
  1530. //                            (/ (- below from) by))))
  1531. //              (set! new-size 0))
  1532. //              #f)
  1533. //          (if new-size
  1534. //              (set! new-size (max new-size 0))
  1535. //              #f)
  1536. //          (size-setter range new-size)))))
  1537.  
  1538. //(define-method range (#rest args) (%apply make (pair <range> args)))
  1539.  
  1540. //(define-method element ((range <range>)
  1541. //            (index <integer>)
  1542. //            #key (default %default-object))
  1543. //  (case (size range)
  1544. //    ((0) (if (id? default %default-object)
  1545. //         (error "element: no elements in range")
  1546. //         default))
  1547. //    ((#f) (if (>= index 0)
  1548. //          (+ (from range) (* (by range) index))
  1549. //          (if (id? default %default-object)
  1550. //          (error  "element: index out of range" index)
  1551. //          default)))
  1552. //    (else: (if (or (>= index (size range)) (< index 0))
  1553. //           (if (id? default %default-object)
  1554. //           (error "element: index out of range" index)
  1555. //           default)
  1556. //           (+ (from range) (* (by range) index))))))
  1557.  
  1558. //(define-method member? (value (range <range>) #key (test id?))
  1559. //  (if (id? test id?)
  1560. //      (if (id? (element range (as <integer>
  1561. //                  (/ (- value (from range)) (by range)))
  1562. //            default: default)
  1563. //           value)
  1564. //      #t
  1565. //      #f)
  1566. //      (for-each ((x range))
  1567. //        ((test x value) #t))))
  1568.  
  1569. //(define-method copy-sequence ((r <range>) #key start end)
  1570. //  (bind ((s (if start start 0)))
  1571. //    (if end
  1572. //        (range from: (element r s) size: (+ (- end s) 1)
  1573. //           by: (by r))
  1574. //        (if (size r)
  1575. //        (range from: (element r s) by: (by r) size: (size r))
  1576. //        (range from: (element r s) by: (by r))))))
  1577.  
  1578. //(define-method binary= ((r1 <range>) (r2 <range>))
  1579. //  (and (= (from r1) (from r2))
  1580. //       (= (by r1)   (by r2))
  1581. //       (= (size r1) (size r2))))
  1582.  
  1583. //(define-method =hash ((r <range>))
  1584. //  (+ (=hash (from r)) (=hash (by r)) (=hash (size r))))
  1585.  
  1586. //(define-method reverse! ((r <range>))
  1587. //  (if (size r)
  1588. //      (begin
  1589. //    (from-setter r (last r))
  1590. //    (by-setter r (negative (by r)))
  1591. //    (above-setter r #f)
  1592. //    (to-setter r #f)
  1593. //    (below-setter r #f)
  1594. //    r)
  1595. //      (error "reverse!: unable to operate on unbounded range")))
  1596.  
  1597. //(define-method reverse ((r <range>))
  1598. //  (if (size r)
  1599. //      (range from: (last r) size: (size r) by: (- (by r)))
  1600. //      (error "reverse: unable to operate on unbounded range")))
  1601.  
  1602. //
  1603. // iteration protocol
  1604. //
  1605.  
  1606. //(define-method initial-state ((range <range>))
  1607. //  (bind ((x (pair #f #f))
  1608. //     (result (element range 0 default: x)))
  1609. //    (if (id? x result)
  1610. //        #f
  1611. //        0)))
  1612.  
  1613. //(define-method next-state ((range <range>) state)
  1614. //  (bind ((x (pair #f #f))
  1615. //     (result (element range (+ state 1) default: x)))
  1616. //    (if (id? x result)
  1617. //        #f
  1618. //        (+ state 1))))
  1619.  
  1620. //(define-method current-element ((range <range>) state)
  1621. //  (element range state))
  1622.  
  1623. // end range.dyl
  1624.  
  1625. //
  1626. // string.dyl
  1627. //
  1628. // string operations 
  1629. //
  1630.  
  1631. //(define-method element ((s <string>)
  1632. //            (i <integer>) 
  1633. //            #key 
  1634. //            (default %default-object))
  1635. //  (%string-element s i default))
  1636. define method element (s :: <string>, i :: <integer>, #key default (%default-object))
  1637.     %string-element(s, i, default);
  1638. end method;
  1639.  
  1640. //(define-method element-setter ((s <string>) (i <integer>) (c <character>))
  1641. //  (%string-element-setter s i c))
  1642. define method element-setter (s :: <string>, i :: <integer>, c :: <character>)
  1643.     %string-element-setter (s, i, c);
  1644. end method;
  1645.  
  1646. //(define-method size ((s <string>)) (%string-size s))
  1647. //(define-method length ((s <string>)) (%string-size s))
  1648. //(define-method append2 ((s1 <string>) (s2 <string>)) (%string-append2 s1 s2))
  1649. define method size (s :: <string>) %string-size(s); end method;
  1650. define method length (s :: <string>) %string-size(s); end method;
  1651. define method append2 (s1 :: <string>, s2 :: <string>) %string-append2(s1, s2); end method;
  1652.  
  1653. //
  1654. // iteration protocol
  1655. //
  1656.  
  1657. //(define-method initial-state ((s <string>))
  1658. //  (if (= (size s) 0)
  1659. //      #f
  1660. //      0))
  1661. define method initial-state (s :: <string>)
  1662.     if (size(s) = 0) #f; else 0; end if;
  1663. end method;
  1664.  
  1665. //(define-method next-state ((s <string>) (state <integer>))
  1666. //  (if (< state (- (size s) 1))
  1667. //      (+ state 1)
  1668. //      #f))
  1669. define method next-state (s :: <string>, state :: <integer>)
  1670.     if (state < size(s)) state + 1; else #f; end if;
  1671. end method;
  1672.  
  1673. //(define-method current-element ((s <string>) (state <integer>))
  1674. //  (%string-element s state %default-object))
  1675. define method current-element (s :: <string>, state :: <integer>)
  1676.     %string-element(s, state, %default-object);
  1677. end method;
  1678.  
  1679. //(define-method current-element-setter ((s <string>) (state <integer>) obj)
  1680. //  (%string-element-setter s state obj))
  1681. define method current-element-setter (s :: <string>, state :: <integer>, obj)
  1682.     %string-element-setter(s, state, obj);
  1683. end method;
  1684.  
  1685. //(define-method copy-state ((s <string>) (state <integer>)) state)
  1686. define method copy-state (s :: <string>, state :: <integer>) state; end method;
  1687.  
  1688. // comparisons
  1689.  
  1690. //(define-method binary< ((s1 <string>) (s2 <string>))
  1691. //  (bind ((result #f))
  1692. //    (for ((s1state (initial-state s1) (next-state s1 s1state))
  1693. //          (s2state (initial-state s2) (next-state s2 s2state)))
  1694. //         ((if (not s1state)
  1695. //          (begin (and s2state (set! result #t))
  1696. //             #t)
  1697. //          (if s2state
  1698. //              (if (< (current-element s1 s1state)
  1699. //                 (current-element s2 s2state))
  1700. //              (begin (set! result #t)
  1701. //                 #t)
  1702. //              #f)
  1703. //              #t))
  1704. //          result))))
  1705.  
  1706. // <pcb> -- these should use fast primitives rather than iteration protocol.
  1707. define method binary< (s1 :: <string>, s2 :: <string>)
  1708.     %string-binary<(s1, s2);
  1709. end method;
  1710.  
  1711. //(define-method binary= ((s1 <string>) (s2 <string>))
  1712. //  (and (= (size s1) (size s2)) (every? = s1 s2)))
  1713. define method binary= (s1 :: <string>, s2 :: <string>)
  1714.     %string-binary=(s1, s2);
  1715. end method;
  1716.  
  1717. // end string.yl
  1718.  
  1719. //
  1720. // vector.dyl
  1721. //
  1722. // Brent Benson
  1723. //
  1724.  
  1725. //(define-method vector (#rest els) (%vector els))
  1726.  
  1727. define method vector (#rest els)
  1728.     %vector(els);
  1729. end method;
  1730.  
  1731. //(define-method element ((v <vector>)
  1732. //            (i <integer>)
  1733. //            #key (default %default-object))
  1734. //  (%vector-element v i default))
  1735.  
  1736. define method element (v :: <vector>, i :: <integer>, #key default (%default-object))
  1737.     %vector-element(v, i, default);
  1738. end method;
  1739.  
  1740. //(define-method element-setter ((v <vector>) (i <integer>) obj)
  1741. //  (%vector-element-setter v i obj))
  1742.  
  1743. define method element-setter (v :: <vector>, i :: <integer>, obj)
  1744.     %vector-element-setter(v, i, obj);
  1745. end method;
  1746.  
  1747. //(define-method size ((v <vector>)) (%vector-size v))
  1748.  
  1749. define method size (v :: <vector>) %vector-size(v); end method;
  1750.  
  1751. //(define-method dimensions ((v <vector>)) (list (%vector-size v)))
  1752.  
  1753. define method dimensions (v :: <vector>) list(%vector-size(v)); end method;
  1754.  
  1755. //(define-method length ((v <vector>)) (%vector-size v))
  1756.  
  1757. define method length(v :: <vector>) %vector-size(v); end method;
  1758.  
  1759. //(define-method append2 ((v1 <vector>) (v2 <vector>)) (%vector-append2 v1 v2))
  1760.  
  1761. define method append2(v1 :: <vector>, v2 :: <vector>) %vector-append2(v1, v2); end method;
  1762.  
  1763. //
  1764. // iteration protocol
  1765. //
  1766.  
  1767. //(define-method initial-state ((v <vector>))
  1768. //  (if (= (size v) 0)
  1769. //      #f
  1770. //      0))
  1771.  
  1772. define method initial-state (v :: <vector>)
  1773.     if (size(v) = 0)
  1774.         #f;
  1775.     else
  1776.         0;
  1777.     end if;
  1778. end method;
  1779.  
  1780. //(define-method next-state ((v <vector>) (state <integer>))
  1781. //  (if (< state (- (size v) 1))
  1782. //      (+ state 1)
  1783. //      #f))
  1784.  
  1785. define method next-state (v :: <vector>, state :: <integer>)
  1786.     if (state < (size(v) - 1))
  1787.         state + 1;
  1788.     else
  1789.         #f;
  1790.     end if;
  1791. end method;
  1792.  
  1793. //(define-method current-element ((v <vector>) (state <integer>))
  1794. //  (%vector-element v state %default-object))
  1795.  
  1796. define method current-element (v :: <vector>, state :: <integer>)
  1797.     %vector-element(v, state, %default-object);
  1798. end method;
  1799.  
  1800. //(define-method current-element-setter ((v <vector>) (state <integer>) obj)
  1801. //  (%vector-element-setter v state obj))
  1802.  
  1803. define method current-element-setter (v :: <vector>, state :: <integer>, obj)
  1804.     %vector-element-setter(v, state, obj);
  1805. end method;
  1806.  
  1807. //(define-method copy-state ((v <vector>) (state <integer>)) state)
  1808.  
  1809. define method copy-state (v :: <vector>, state :: <integer>) state; end method;
  1810.  
  1811. //(define-method previous-state ((v <vector>) (state <integer>))
  1812. //  (if (<= state 0)
  1813. //      #f
  1814. //      (- state 1)))
  1815.  
  1816. define method previous-state (v :: <vector>, state :: <integer>)
  1817.     if (state > 0)
  1818.         state - 1;
  1819.     else
  1820.         #f;
  1821.     end if;
  1822. end method;
  1823.  
  1824. //(define-method final-state ((v <vector>)) (- (size v) 1))
  1825.  
  1826. define method final-state (v :: <vector>) size(v) - 1; end method;
  1827.  
  1828. // end vector.dyl
  1829.  
  1830. // stretchy-vector
  1831. //
  1832. // jnw@cis.ufl.edu
  1833. //
  1834.  
  1835. //(define-class <stretchy-vector> (<stretchy-collection> <vector>)
  1836. //  (rep type: <vector> )
  1837. //  (size init-keyword: size:)
  1838. //  (fill init-keyword: fill:))
  1839.  
  1840. define class <stretchy-vector> (<stretchy-collection>, <vector>)
  1841.     slot rep, type: <vector>;
  1842.     slot size, init-keyword: size:, init-value: 0;
  1843.     slot fill, init-keyword: fill:, init-value: #f;
  1844. end class;
  1845.  
  1846. // initialize method.
  1847. define method initialize (sv :: <stretchy-vector>, #key, #all-keys)
  1848.     next-method();
  1849.     sv.rep := make(<vector>, size: sv.size, fill: sv.fill);
  1850. end method;
  1851.  
  1852. // end stretchy-vector
  1853.  
  1854. //
  1855. // table.dyl
  1856. //
  1857. // Brent Benson
  1858. //
  1859.  
  1860. //(define-method element ((t <table>) key #key (default %default-object))
  1861. //  (%table-element t key default))
  1862.  
  1863. define method element (t :: <table>, key, #key default (%default-object))
  1864.     %table-element(t, key, default);
  1865. end method;
  1866.  
  1867. //(define-method element-setter ((t <table>) key value) (%table-element-setter t key value))
  1868.  
  1869. define method element-setter (t :: <table>, key, value)
  1870.     %table-element-setter(t, key, value);
  1871. end method;
  1872.  
  1873. //(define-method initial-state ((t <table>)) (%table-initial-state t))
  1874.  
  1875. define method initial-state (t :: <table>) %table-initial-state(t); end method;
  1876.  
  1877. //(define-method next-state ((t <table>) (te <table-entry>)) (%table-next-state t te))
  1878.  
  1879. define method next-state (t :: <table>, te :: <table-entry>)
  1880.     %table-next-state(t, te);
  1881. end method;
  1882.  
  1883. //(define-method current-element ((t <table>) (te <table-entry>)) (%table-current-element t te))
  1884.  
  1885. define method current-element (t :: <table>, te :: <table-entry>)
  1886.     %table-current-element(t, te);
  1887. end method;
  1888.  
  1889. //(define-method current-element-setter ((t <table>) (te <table-entry>) value)
  1890. //  (%table-current-element-setter t te value))
  1891.  
  1892. define method current-element-setter (t :: <table>, te :: <table-entry>, value)
  1893.     %table-current-element-setter(t, te, value);
  1894. end method;
  1895.  
  1896. //(define-method current-key ((t <table>) (te <table-entry>)) (%table-current-key t te))
  1897.  
  1898. define method current-key (t :: <table>, te :: <table-entry>)
  1899.     %table-current-key(t, te);
  1900. end method;
  1901.  
  1902. //(define-method key-sequence ((t <table>))
  1903. //  (bind ((keys '()))
  1904. //    (for ((state (initial-state t) (next-state t state)))
  1905. //    ((not state) keys)
  1906. //      (set! keys (pair (current-key t state) keys)))))
  1907.  
  1908. define method key-sequence (t :: <table>)
  1909.     let keys = #();
  1910.     for (state = initial-state(t) then next-state(t, state) until (~state))
  1911.         keys := pair(current-key(t, state), keys);
  1912.     finally
  1913.         keys;
  1914.     end for;
  1915. end method;
  1916.  
  1917. // end table.dyl
  1918.  
  1919. //
  1920. // deque.dyl
  1921. //
  1922. // Brent Benson
  1923. //
  1924.  
  1925. //(define-method push ((d <deque>) new) (%push d new))
  1926. //(define-method pop ((d <deque>)) (%pop d))
  1927. //(define-method push-last ((d <deque>) new) (%push-last d new))
  1928. //(define-method pop-last ((d <deque>)) (%pop-last d))
  1929.  
  1930. define method push (d :: <deque>, new)
  1931.     %push(d, new);
  1932. end method;
  1933. define method pop (d :: <deque>)
  1934.     %pop(d);
  1935. end method;
  1936. define method push-last (d :: <deque>, new)
  1937.     %push-last(d, new);
  1938. end method;
  1939. define method pop-last (d :: <deque>)
  1940.     %pop-last(d, new);
  1941. end method;
  1942.  
  1943. //(define-method first ((d <deque>) #key (default %default-object))
  1944. //  (%deque-first d default))
  1945.  
  1946. define method first (d :: <deque>, #key default (%default-object))
  1947.     %deque-first(d, default);
  1948. end method;
  1949.  
  1950. //(define-method last ((d <deque>) #key (default %default-object))
  1951. //  (%deque-last d default))
  1952.  
  1953. define method last (d :: <deque>, #key default (%default-object))
  1954.     %deque-last(d, default);
  1955. end method;
  1956.  
  1957. // should add specific (define-method last-setter ((d <deque>) new-value) ...)
  1958. //(define-method element ((d <deque>)
  1959. //            (i <integer>)
  1960. //            #key (default %default-object))
  1961. //  (%deque-element d i default))
  1962.  
  1963. define method element (d :: <deque>, i :: <integer>, #key default (%default-object))
  1964.     %deque-element(d, i, new);
  1965. end method;
  1966.  
  1967. //(define-method element-setter ((d <deque>) (i <integer>) new) 
  1968. //  (%deque-element-setter d i new))
  1969.  
  1970. define method element-setter (d :: <deque>, i :: <integer>, new)
  1971.     %deque-element-setter(d, i, new);
  1972. end method;
  1973.  
  1974. //(define-method add! ((d <deque>) new) (%push d new))
  1975.  
  1976. define method add! (d :: <deque>, new)
  1977.     %push(d, new);
  1978. end method;
  1979.  
  1980. //
  1981. // add remove!
  1982. // 
  1983.  
  1984. //
  1985. // iteration protocol
  1986. //
  1987.  
  1988. //(define-method initial-state ((d <deque>)) (%deque-initial-state d))
  1989. //(define-method final-state ((d <deque>)) (%deque-final-state d))
  1990.  
  1991. define method initial-state (d :: <deque>)
  1992.     %deque-initial-state(d);
  1993. end method;
  1994. define method final-state (d :: <deque>)
  1995.     %deque-final-state(d);
  1996. end method;
  1997.  
  1998. //(define-method next-state ((d <deque>) (state <deque-entry>)) 
  1999. //  (%deque-next-state d state))
  2000. //(define-method previous-state ((d <deque>) (state <deque-entry>)) 
  2001. //  (%deque-previous-state d state))
  2002.  
  2003. define method next-state (d :: <deque>, state :: <deque-entry>)
  2004.     %deque-next-state(d, state);
  2005. end method;
  2006. define method previous-state (d :: <deque>, state :: <deque-entry>)
  2007.     %deque-previous-state(d, state);
  2008. end method;
  2009.  
  2010. //(define-method current-element ((d <deque>) (state <deque-entry>)) 
  2011. //  (%deque-current-element d state))
  2012. //(define-method current-element-setter ((d <deque>)
  2013. //                       (state <deque-entry>)
  2014. //                       new-value) 
  2015. //  (%deque-current-element-setter d state new-value))
  2016.  
  2017. define method current-element (d :: <deque>, state :: <deque-entry>)
  2018.     %deque-current-element(d, state);
  2019. end method;
  2020. define method current-element-setter (d :: <deque>, state :: <deque-entry>, new-value)
  2021.     %deque-current-element-setter(d, state, newvalue);
  2022. end method;
  2023.  
  2024. // end deque.dyl
  2025.  
  2026. //
  2027. // array.dyl
  2028. //
  2029. // Brent Benson
  2030. //
  2031.  
  2032. // need to add default
  2033.  
  2034. //(define-method element ((a <array>)
  2035. //            (indices <list>)
  2036. //            #key (default %default-object))
  2037. //  (%array-element a indices default))
  2038. //(define-method element-setter ((a <array>) (inds <list>) new-value)
  2039. //  (%array-element-setter a inds new-value))
  2040.  
  2041. define method element (a :: <array>, indices :: <list>, #key default (%default-object))
  2042.     %array-element(a, indices, default);
  2043. end method;
  2044. define method element-setter (a :: <array>, indices :: <list>, new-value)
  2045.     %array-element-setter(a, indices, default);
  2046. end method;
  2047.  
  2048. //(define-method dimensions ((a <array>)) (%array-dimensions a))
  2049. //(define-method size ((a <array>)) (reduce * 1 (%array-dimensions a)))
  2050. //(define-method rank ((a <array>)) (length (%array-dimensions a)))
  2051. //(define-method row-major-index ((a <array>) #rest subscripts)
  2052. //  (%array-row-major-index a subscripts))
  2053.  
  2054. define method dimensions (a :: <array>)
  2055.     %array-dimensions(a);
  2056. end method;
  2057. define method size (a :: <array>)
  2058.     reduce(\*, 1, %array-dimensions(a));
  2059. end method;
  2060. define method rank (a :: <array>)
  2061.     length(%array-dimensions(a));
  2062. end method;
  2063. define method row-major-index(a :: <array>, #rest subscripts)
  2064.     %array-row-major-index(a, subscripts);
  2065. end method;
  2066.  
  2067. //(define-method aref ((a <array>) #rest indices) (%array-element a indices %default-object))
  2068.  
  2069. define method aref (a :: <array>, #rest indices)
  2070.     %array-element(a, indices, %default-object);
  2071. end method;
  2072.  
  2073. //(define-method aref-setter ((a <array>) #rest indicies-and-val)
  2074. //  (bind-methods ((but-last (lst)
  2075. //           (cond
  2076. //            ((empty? lst) '())
  2077. //            ((empty? (tail lst)) '())
  2078. //            (else: (pair (head lst) (but-last (tail lst)))))))
  2079. //    (bind ((new-val (last indicies-and-val))
  2080. //       (indicies (but-last indicies-and-val)))
  2081. //      (%array-element-setter a indicies new-val))))
  2082.  
  2083. define method aref-setter (a :: <array>, #rest indicies-and-val)
  2084.     local method except-last (lst)
  2085.         if (empty?(lst) | empty?(tail(lst)))
  2086.             #();
  2087.         else
  2088.             pair(head(lst), except-last(tail(lst)));
  2089.         end if;
  2090.     end but-last;
  2091.     let new-val = last(indicies-and-val);
  2092.     let indicies = except-last(indicies-and-val);
  2093.     %array-element-setter(a, indicies, new-val);
  2094. end method;
  2095.  
  2096. //(define-method dimension ((array <array>) (axis <integer>))
  2097. //  (element (dimensions array) axis))
  2098.  
  2099. define method dimension (a :: <array>, axis :: <integer>)
  2100.     dimensions(a)[axis];
  2101. end method;
  2102.  
  2103. //
  2104. // iteration protocol
  2105. //
  2106.  
  2107. //(define-method initial-state ((a <array>)) (%array-initial-state a))
  2108. //(define-method next-state ((a <array>) (s <integer>))
  2109. //  (%array-next-state a s))
  2110.  
  2111. define method initial-state (a :: <array>)
  2112.     %array-initial-state(a);
  2113. end method;
  2114.  
  2115. define method next-state (a :: <array>, state :: <integer>)
  2116.     %array-next-state(a, state);
  2117. end method;
  2118.  
  2119. //(define-method current-element ((a <array>) (s <integer>))
  2120. //  (%array-current-element a s))
  2121.  
  2122. define method current-element (a :: <array>, state :: <integer>)
  2123.     %array-current-element(a, state);
  2124. end method;
  2125.  
  2126. // end array.dyl
  2127.  
  2128. //
  2129. // numbers
  2130. //
  2131.  
  2132. //
  2133. // number.dyl - generic functions on numbers
  2134. //
  2135. // Brent Benson
  2136. //
  2137.  
  2138. //
  2139. // misc
  2140. //
  2141. //(define-method odd? ((i <integer>)) (%odd? i))
  2142. //(define-method even? ((i <integer>)) (%even? i))
  2143. //(define-method zero? ((i <integer>)) (%int-zero? i))
  2144. //(define-method zero? ((d <double-float>)) (%double-zero? d))
  2145. //(define-method positive? ((i <integer>)) (%int-positive? i))
  2146. //(define-method positive? ((d <double-float>)) (%double-positive? d))
  2147. //(define-method negative? ((i <integer>)) (%int-negative? i))
  2148. //(define-method negative? ((d <double-float>)) (%double-negative? d))
  2149. //(define-method integral? ((n <number>)) (%integral? n))
  2150. //(define-method quotient ((i1 <integer>) (i2 <integer>)) (%quotient i1 i2))
  2151.  
  2152. define method odd? (i :: <integer>) %odd?(i); end method;
  2153. define method even? (i :: <integer>) %even?(i); end method;
  2154. define method zero? (i :: <integer>) %int-zero?(i); end method;
  2155. define method zero? (d :: <double-float>) %double-zero?(d); end method;
  2156. define method positive? (i :: <integer>) %int-positive?(i); end method;
  2157. define method positive? (d :: <double-float>) %double-positive?(d); end method;
  2158. define method negative? (i :: <integer>) %int-negative?(i); end method;
  2159. define method negative? (d :: <double-float>) %double-negative?(d); end method;
  2160. define method integral? (n :: <number>) %integral?(n); end method;
  2161. define method quotient (i1 :: <integer>, i2 :: <integer>) %quotient?(i1, i2); end method;
  2162.  
  2163. //
  2164. // coercions
  2165. //
  2166. //(define-method as ((df-class (singleton <double-float>)) (i <integer>))
  2167. //  (%int-to-double i))
  2168.  
  2169. define method as (df-class == <double-float>, i :: <integer>)
  2170.     %int-to-double(i);
  2171. end method;
  2172.  
  2173. //(define-method as ((int-class (singleton <integer>)) (df <double-float>))
  2174. //  (%double-to-int df))
  2175.  
  2176. define method as (df-class == <integer>, df :: <double-float>)
  2177.     %double-to-int(df);
  2178. end method;
  2179.  
  2180. //
  2181. // multi-argument versions (?)
  2182. //
  2183.  
  2184. //(define-method + ((n1 <number>) (n2 <number>)) (binary+ n1 n2))
  2185. //(define-method * ((n1 <number>) (n2 <number>)) (binary* n1 n2))
  2186.  
  2187. define method \+ (n1 :: <number>, n2 :: <number>)
  2188.     binary+(n1, n2);
  2189. end method;
  2190. define method \* (n1 :: <number>, n2 :: <number>)
  2191.     binary*(n1, n2);
  2192. end method;
  2193.  
  2194. //(define-method negative ((i <integer>)) (%int-negative i))
  2195. //(define-method negative ((d <double-float>)) (%double-negative d))
  2196.  
  2197. define method negative (i :: <integer>) %int-negative(i); end method;
  2198. define method negative (d :: <double-float>) %double-negative(d); end method;
  2199.  
  2200. //(define-method - ((n1 <number>) (n2 <number>))
  2201. //  (binary- n1 n2))
  2202.  
  2203. define method \- (n1 :: <number>, n2 :: <number>)
  2204.     binary-(n1, n2);
  2205. end method;
  2206.   
  2207. //(define-method unary/ ((i <integer>)) (%int-inverse i))
  2208. //(define-method unary/ ((d <double-float>)) (%double-inverse d))
  2209. //(define-method / ((n1 <number>) (n2 <number>))
  2210. //   ( binary/ n1 n2))
  2211.  
  2212. define method unary/ (i :: <integer>) %int-inverse(i); end method;
  2213. define method unary/ (d :: <double-float>) %double-inverse(i); end method;
  2214. define method \/ (n1 :: <number>, n2 :: <number>)
  2215.     binary/(n1, n2);
  2216. end method;
  2217.  
  2218. //
  2219. // (op <integer> <integer>)
  2220. // <integer> op <integer>
  2221. //
  2222.  
  2223. //(define-method binary+ ((i1 <integer>) (i2 <integer>))
  2224. //  (%binary-int+ i1 i2))
  2225.  
  2226. define method binary+ (i1 :: <integer>, i2 :: <integer>)
  2227.     %binary-int+(i1, i2);
  2228. end method;
  2229.  
  2230. //(define-method binary- ((i1 <integer>) (i2 <integer>))
  2231. //  (%binary-int- i1 i2))
  2232.  
  2233. define method binary- (i1 :: <integer>, i2 :: <integer>)
  2234.     %binary-int-(i1, i2);
  2235. end method;
  2236.  
  2237. //(define-method binary* ((i1 <integer>) (i2 <integer>))
  2238. //  (%binary-int* i1 i2))
  2239.  
  2240. define method binary* (i1 :: <integer>, i2 :: <integer>)
  2241.     %binary-int*(i1, i2);
  2242. end method;
  2243.  
  2244. //(define-method binary/ ((i1 <integer>) (i2 <integer>))
  2245. //  (%binary-int/ i1 i2))
  2246.  
  2247. define method binary/ (i1 :: <integer>, i2 :: <integer>)
  2248.     %binary-int/(i1, i2);
  2249. end method;
  2250.  
  2251. //
  2252. // (op <double-float> <double-float>)
  2253. // <double-float> op <double-float>
  2254. //
  2255.  
  2256. //(define-method binary+ ((d1 <double-float>) (d2 <double-float>))
  2257. //  (%binary-double+ d1 d2))
  2258. define method binary+ (d1 :: <double-float>, d2 :: <double-float>)
  2259.     %binary-double+(d1, d2);
  2260. end method;
  2261.  
  2262. //(define-method binary- ((d1 <double-float>) (d2 <double-float>))
  2263. //  (%binary-double- d1 d2))
  2264. define method binary- (d1 :: <double-float>, d2 :: <double-float>)
  2265.     %binary-double-(d1, d2);
  2266. end method;
  2267.  
  2268. //(define-method binary* ((d1 <double-float>) (d2 <double-float>))
  2269. //  (%binary-double* d1 d2))
  2270. define method binary* (d1 :: <double-float>, d2 :: <double-float>)
  2271.     %binary-double*(d1, d2);
  2272. end method;
  2273.  
  2274. //(define-method binary/ ((d1 <double-float>) (d2 <double-float>))
  2275. //  (%binary-double/ d1 d2))
  2276. define method binary/ (d1 :: <double-float>, d2 :: <double-float>)
  2277.     %binary-double/(d1, d2);
  2278. end method;
  2279.  
  2280. //
  2281. // (op <integer> <double-float>)
  2282. // <integer> op <double-float>
  2283. //
  2284.  
  2285. //(define-method binary+ ((i1 <integer>) (d2 <double-float>))
  2286. //  (%binary-double+ (as <double-float> i1) d2))
  2287.  
  2288. define method binary+ (i1 :: <integer>, d2 :: <double-float>)
  2289.     %binary-double+(as(<double-float>, i1), d2);
  2290. end method;
  2291.  
  2292. //(define-method binary- ((i1 <integer>) (d2 <double-float>))
  2293. //  (%binary-double- (as <double-float> i1) d2))
  2294.  
  2295. define method binary- (i1 :: <integer>, d2 :: <double-float>)
  2296.     %binary-double-(as(<double-float>, i1), d2);
  2297. end method;
  2298.  
  2299. //(define-method binary* ((i1 <integer>) (d2 <double-float>))
  2300. //  (%binary-double* (as <double-float> i1) d2))
  2301.  
  2302. define method binary* (i1 :: <integer>, d2 :: <double-float>)
  2303.     %binary-double*(as(<double-float>, i1), d2);
  2304. end method;
  2305.  
  2306. //(define-method binary/ ((i1 <integer>) (d2 <double-float>))
  2307. //  (%binary-double/ (as <double-float> i1) d2))
  2308.  
  2309. define method binary/ (i1 :: <integer>, d2 :: <double-float>)
  2310.     %binary-double/(as(<double-float>, i1), d2);
  2311. end method;
  2312.  
  2313. //
  2314. // (op <double-float> <integer>)
  2315. //
  2316. //(define-method binary+ ((d1 <double-float>) (i2 <integer>))
  2317. //  (%binary-double+ d1 (as <double-float> i2)))
  2318.  
  2319. define method binary+ (d1 :: <double-float>, i2 :: <integer>)
  2320.     %binary-double+(d1, as(<double-float>, i2));
  2321. end method;
  2322.  
  2323. //(define-method binary- ((d1 <double-float>) (i2 <integer>))
  2324. //  (%binary-double- d1 (as <double-float> i2)))
  2325.  
  2326. define method binary- (d1 :: <double-float>, i2 :: <integer>)
  2327.     %binary-double-(d1, as(<double-float>, i2));
  2328. end method;
  2329.  
  2330. //(define-method binary* ((d1 <double-float>) (i2 <integer>))
  2331. //  (%binary-double* d1 (as <double-float> i2)))
  2332.  
  2333. define method binary* (d1 :: <double-float>, i2 :: <integer>)
  2334.     %binary-double*(d1, as(<double-float>, i2));
  2335. end method;
  2336.  
  2337. //(define-method binary/ ((d1 <double-float>) (i2 <integer>))
  2338. //  (%binary-double/ d1 (as <double-float> i2)))
  2339.  
  2340. define method binary/ (d1 :: <double-float>, i2 :: <integer>)
  2341.     %binary-double/(d1, as(<double-float>, i2));
  2342. end method;
  2343.  
  2344. //
  2345. // comparisons
  2346. //
  2347.  
  2348. //(define-method binary= ((n1 <number>) (n2 <number>))
  2349. //  (id? n1 n2))
  2350.  
  2351. // default \= for <object> suffices. binary= is obsolete. it
  2352. // should instead be \=.
  2353.  
  2354. //(define-method binary= ((i <integer>) (d <double-float>))
  2355. //  (id? (as <double-float> i) d))
  2356.  
  2357. define method \= (i :: <integer>, d :: <double-float>)
  2358.     as(<double-float>, i) == d;
  2359. end method;
  2360.  
  2361. // (define-method binary= ((d <double-float>) (i <integer>))
  2362. //  (id? d (as <double-float> i)))
  2363.  
  2364. define method \= (d :: <double-float>, i :: <integer>)
  2365.     d == as(<double-float>, i);
  2366. end method;
  2367.  
  2368. //(define-method binary< ((n1 <number>) (n2 <number>))
  2369. //  (%binary-less-than n1 n2))
  2370.  
  2371. define method \< (n1 :: <number>, n2 :: <number>)
  2372.     %binary-less-than(n1, n2);
  2373. end method;
  2374.  
  2375. //(define-method max ((n1 <real>) #rest more-reals)
  2376. //  (bind-methods ((help ((n1 <real>) more)
  2377. //           (if (empty? more)
  2378. //               n1
  2379. //               (bind ((n2 (head more))
  2380. //                  (largest (if (binary< n1 n2) n2 n1)))
  2381. //             (help largest (tail more))))))
  2382. //    (help n1 more-reals)))
  2383.  
  2384. //define method max (n1 :: <real>, #rest more-reals)
  2385. //    local method help (n1 :: <real>, more)
  2386. //        if (empty?(more))
  2387. //            n1;
  2388. //        else
  2389. //            let n2 = head(more);
  2390. //            let largest = if (n1 > n2) n1 else n2; end if;
  2391. //            help(largest, tail(more));
  2392. //        end if;
  2393. //    end help;
  2394. //    help(n1, more-reals);
  2395. //end method;
  2396.  
  2397. // more imperatively... (i.e. faster)
  2398. define method max (n1 :: <real>, #rest more-reals)
  2399.     let largest = n1;
  2400.     until (more-reals == #())
  2401.         let n = head(more-reals);
  2402.         if (n > largest)
  2403.             largest := n;
  2404.         end if;
  2405.         more-reals := tail(more-reals);
  2406.     end until;
  2407.     largest;
  2408. end method;
  2409.  
  2410. //(define-method min ((n1 <real>) #rest more-reals)
  2411. //  (bind-methods ((help ((n1 <real>) more)
  2412. //           (if (empty? more)
  2413. //               n1
  2414. //               (bind ((n2 (head more))
  2415. //                  (smallest (if (binary< n1 n2) n1 n2)))
  2416. //             (help smallest (tail more))))))
  2417. //    (help n1 more-reals)))
  2418.  
  2419. //define method min (n1 :: <real>, #rest more-reals)
  2420. //    local method help (n1 :: <real>, more)
  2421. //        if (empty?(more))
  2422. //            n1;
  2423. //        else
  2424. //            let n2 = head(more);
  2425. //            let smallest = if (n1 < n2) n1 else n2; end if;
  2426. //            help(smallest, tail(more));
  2427. //        end if;
  2428. //    end help;
  2429. //    help(n1, more-reals);
  2430. //end method;
  2431.  
  2432. define method min (n1 :: <real>, #rest more-reals)
  2433.     let smallest = n1;
  2434.     until (more-reals == #())
  2435.         let n = head(more-reals);
  2436.         if (n < smallest)
  2437.             smallest := n;
  2438.         end if;
  2439.         more-reals := tail(more-reals);
  2440.     end until;
  2441.     smallest;
  2442. end method;
  2443.  
  2444. //
  2445. // other functions
  2446. //
  2447.  
  2448. //(define-method sqrt ((i <integer>)) (%int-sqrt i))
  2449. // (define-method sqrt ((d <double-float>)) (%double-sqrt d))
  2450.  
  2451. define method sqrt (i :: <integer>)
  2452.     %int-sqrt(i);
  2453. end method;
  2454. define method sqrt (d :: <double-float>)
  2455.     %double-sqrt(d);
  2456. end method;
  2457.  
  2458. // (define-method abs ((i <integer>)) (%int-abs i))
  2459. // (define-method abs ((d <double-float>)) (%double-abs d))
  2460.  
  2461. define method abs (i :: <integer>)
  2462.     %int-abs(i);
  2463. end method;
  2464. define method abs (d :: <double-float>)
  2465.     %double-abs(d);
  2466. end method;
  2467.  
  2468. //(define-method ash ((i <integer>) (count <integer>)) (%ash i count))
  2469.  
  2470. define method ash (i :: <integer>, count :: <integer>)
  2471.     %ash(i, count);
  2472. end method;
  2473.  
  2474. //(define-method sin ((n <number>)) (%sin (as <double-float> n)))
  2475. //(define-method cos ((n <number>)) (%cos (as <double-float> n)))
  2476.  
  2477. define method sin (n :: <number>)
  2478.     %sin(as(<double-float>, n));
  2479. end method;
  2480. define method cos (n :: <number>)
  2481.     %cos(as(<double-float>, n));
  2482. end method;
  2483.  
  2484. //(define-method atan2 ((n1 <number>) (n2 <number>))
  2485. //     (%atan2 (as <double-float> n1) (as <double-float> n2)))
  2486.  
  2487. define method atan2 (n1 :: <number>, n2 :: <number>)
  2488.     %atan2(as(<double-float>, n1), as(<double-float>, n2));
  2489. end method;
  2490.  
  2491. //(define-method logior (#rest integers) (reduce1 %binary-logior integers))
  2492. //(define-method logand (#rest integers) (reduce1 %binary-logand integers))
  2493. //(define-method truncate ((n <number>)) (%truncate (as <double-float> n)))
  2494. //(define-method modulo ((i1 <number>) (i2 <number>))
  2495. //   (%modulo i1 i2))
  2496.  
  2497. // exp and ln.
  2498. //(define-method exp ((n <number>)) (%exp (as <double-float> n)))
  2499. //(define-method ln ((n <number>)) (%ln (as <double-float> n)))
  2500.  
  2501. define method exp (n :: <number>)
  2502.     %exp(as(<double-float>, n));
  2503. end method;
  2504. define method ln (n :: <number>)
  2505.     %ln(as(<double-float>, n));
  2506. end method;
  2507. define method log (n :: <number>)
  2508.     %ln(as(<double-float>, n));
  2509. end method;
  2510.  
  2511. define method \^ (n1 :: <number>, n2 :: <number>)
  2512.     %pow(as(<double-float>, n1), as(<double-float>, n2));
  2513. end method;
  2514.  
  2515. // end number.dyl
  2516.  
  2517. //
  2518. // characters
  2519. //
  2520.  
  2521. //
  2522. // character.dyl
  2523. //
  2524. // Brent Benson
  2525. //
  2526.  
  2527. //(define-method as ((ic (singleton <integer>)) (ch <character>))
  2528. //  (%character->integer ch))
  2529.  
  2530. define method as (ic == <integer>, ch :: <character>)
  2531.     %character->integer(ch);
  2532. end;
  2533.  
  2534. //(define-method as ((cc (singleton <character>)) (i <integer>))
  2535. //  (%integer->character i))
  2536.  
  2537. define method as (cc == <character>, i :: <integer>)
  2538.     %integer->character(i);
  2539. end;
  2540.  
  2541. // comparisons
  2542.  
  2543. //(define-method binary< ((c1 <character>) (c2 <character>))
  2544. //  (binary< (as <integer> c1) (as <integer> c2)))
  2545.  
  2546. define method \< (c1 :: <character>, c2 :: <character>)
  2547.     as(<integer>, c1) < as(<integer>, c2);
  2548. end method;
  2549.  
  2550. // functionals
  2551.  
  2552. //(define-method compose ((function <function>)
  2553. //            #rest more-functions)
  2554. //  (if (empty? more-functions)
  2555. //      function
  2556. //      (method ( #rest args)
  2557. //          (function (apply (apply compose (car more-functions)
  2558. //                      (cdr more-functions))                    
  2559. //                   args)))))
  2560.  
  2561. define method compose(function :: <function>, #rest more-functions)
  2562.     if (empty?(more-functions))
  2563.         function;
  2564.     else
  2565.         method (#rest args)
  2566.             function(apply(apply(compose, head(more-functions), tail(more-functions)), args));
  2567.         end;
  2568.     end;
  2569. end method;
  2570.  
  2571. //(define-method complement ((function <function>))
  2572. //  (method (#rest args) (not (apply function args))))
  2573. define method complement (f :: <function>)
  2574.     method (#rest args)
  2575.         ~(apply(func, args));
  2576.     end;
  2577. end method;
  2578.  
  2579. //(define-method disjoin ((function <function>) #rest functions)
  2580. //;
  2581. //; Not very efficient, but works --  jnw
  2582. //;
  2583. //  (method (#rest args)
  2584. //      (if (empty? functions)
  2585. //          (apply function args)
  2586. //          (or (apply function args)
  2587. //          (apply (apply disjoin functions) args)))))
  2588.  
  2589. define method disjoin (func :: <function>, #rest functions)
  2590.     method (#rest args)
  2591.         let disjunction = %apply(func, args);
  2592.         let fns = functions;
  2593.         while ((~disjunction) & (fns ~= #()))
  2594.             disjunction := %apply(head(fns), args);
  2595.             fns := tail(fns);
  2596.         end while;
  2597.         disjunction;
  2598.     end;
  2599. end method;
  2600.  
  2601. //(define-method conjoin ((function <function>) #rest functions)
  2602. //; Not very efficient, but works -- jnw
  2603. //  (method (#rest args)
  2604. //      (if (empty? functions)
  2605. //          (apply function args)
  2606. //          (and (apply function args)
  2607. //           (apply (apply conjoin functions) args)))))
  2608.  
  2609. //(define-method curry ((f <function>)
  2610. //              #rest curried-args)
  2611. //  (method (#rest regular-args)
  2612. //      (apply f (concatenate curried-args regular-args))))
  2613.  
  2614. //(define-method rcurry ((f <function>)
  2615. //              #rest curried-args)
  2616. //  (method (#rest regular-args)
  2617. //      (apply f (concatenate regular-args curried-args))))
  2618.  
  2619. //(define-method always ((obj <object>))
  2620. //  (method (#rest args) obj))
  2621.  
  2622. // eof
  2623. // princ("at eof.");
  2624.